/// <summary> /// Safely runs this job. /// </summary> /// <param name="context">The job context.</param> /// <param name="token">The cancellation token used to cancel the job from running.</param> /// <returns> /// A <see cref="JobResult"/> instance indicating the results of the job. /// </returns> public JobResult TryRun(JobRunContext context = null, CancellationToken? token = null) { try { return Run(context, token); } catch (Exception ex) { return new JobResult { Error = ex, Message = "Failed" }; } }
public override Task<JobResult> RunAsync(JobRunContext context) { Log.Info().Message("Remove stale accounts job starting").Write(); var organizations = _organizationRepository.GetAbandoned(); while (organizations.Count > 0) { foreach (var organization in organizations) TryDeleteOrganization(organization); organizations = _organizationRepository.GetAbandoned(); } return Task.FromResult(new JobResult { Message = "Successfully removed all stale accounts." }); }
public async override Task<JobResult> RunAsync(JobRunContext context) { Log.Info().Message("Process email message job starting").Write(); int totalUserDescriptionsProcessed = 0; int totalUserDescriptionsToProcess = -1; if (context.Properties.ContainsKey("TotalUserDescriptionsToProcess")) totalUserDescriptionsToProcess = (int)context.Properties["TotalUserDescriptionsToProcess"]; while (!CancelPending && (totalUserDescriptionsToProcess == -1 || totalUserDescriptionsProcessed < totalUserDescriptionsToProcess)) { QueueEntry<EventUserDescription> queueEntry = null; try { queueEntry = await _queue.DequeueAsync(); } catch (Exception ex) { if (!(ex is TimeoutException)) { Log.Error().Exception(ex).Message("An error occurred while trying to dequeue the next EventUserDescription: {0}", ex.Message).Write(); return JobResult.FromException(ex); } } if (queueEntry == null) continue; // TODO: Should we validate the dequeued item? _statsClient.Counter(StatNames.EventsUserDescriptionDequeued); Log.Info().Message("Processing EventUserDescription '{0}'.", queueEntry.Id).Write(); try { ProcessUserDescription(queueEntry.Value); totalUserDescriptionsProcessed++; _statsClient.Counter(StatNames.EventsUserDescriptionProcessed); } catch (Exception ex) { _statsClient.Counter(StatNames.EventsUserDescriptionErrors); queueEntry.AbandonAsync().Wait(); // TODO: Add the EventUserDescription to the logged exception. Log.Error().Exception(ex).Message("An error occurred while processing the EventUserDescription '{0}': {1}", queueEntry.Id, ex.Message).Write(); return JobResult.FromException(ex); } await queueEntry.CompleteAsync(); } return JobResult.Success; }
public override Task<JobResult> RunAsync(JobRunContext context) { Log.Info().Message("Daily Notification job starting").Write(); if (!Settings.Current.EnableSummaryNotifications) return Task.FromResult(new JobResult { Message = "Summary Notifications are disabled.", IsCancelled = true }); const int BATCH_SIZE = 25; // Get all project id's that should be sent at 9:00am in the projects local time. var projects = _projectRepository.GetByNextSummaryNotificationOffset(9, BATCH_SIZE); while (projects.Count > 0) { var documentsUpdated = _projectRepository.IncrementNextSummaryEndOfDayTicks(projects.Select(p => p.Id).ToList()); Log.Info().Message("Daily Notification job processing {0} projects. Successfully updated {1} projects. ", projects.Count, documentsUpdated); Debug.Assert(projects.Count == documentsUpdated); foreach (var project in projects) { var utcStartTime = new DateTime(project.NextSummaryEndOfDayTicks - TimeSpan.TicksPerDay); if (utcStartTime < DateTime.UtcNow.Date.SubtractDays(2)) { Log.Info().Message("Skipping Summary Notification older than two days for Project: {0} with a start time of {1}.", project.Id, utcStartTime); continue; } if (_summaryNotificationQueue != null) { var notification = new SummaryNotification { Id = project.Id, UtcStartTime = utcStartTime, UtcEndTime = new DateTime(project.NextSummaryEndOfDayTicks - TimeSpan.TicksPerSecond) }; Log.Info().Message("Publishing Summary Notification for Project: {0}, with a start time of {1} and an end time of {2}", notification.Id, notification.UtcStartTime, notification.UtcEndTime); _summaryNotificationQueue.EnqueueAsync(notification); } else Log.Error().Message("Message Factory is null").Write(); } projects = _projectRepository.GetByNextSummaryNotificationOffset(9, BATCH_SIZE); } return Task.FromResult(new JobResult { Message = "Successfully enforced all retention limits." }); }
public void Run(int totalUserDescriptionsToProcess) { var context = new JobRunContext(); context.Properties.Add("TotalUserDescriptionsToProcess", totalUserDescriptionsToProcess); Run(context); }
private void RunInternal() { if (IsBusy) return; IsBusy = true; // get lock using (var jobLock = _jobLockProvider.Acquire(Name)) { // give up if no lock if (!jobLock.LockAcquired) { LastResult = "Could not acquire a job lock."; LastStatus = JobStatus.Canceled; Status = JobStatus.Waiting; IsBusy = false; return; } DateTime started = DateTime.Now; LastRunStartTime = started; JobManager.Current.OnJobRunning(new JobEventArgs(Name, JobAction.Running, _id)); Status = JobStatus.Running; Interlocked.Increment(ref JobManager.JobsRunning); try { CreateInstance(); var context = new JobRunContext(UpdateStatus); _tokenSource = new CancellationTokenSource(); var task = _instance.RunAsync(context, _tokenSource.Token); task.Wait(); JobResult r = task.Result; if (task.IsFaulted && task.Exception != null) { LastResult = task.Exception.Message; } else if (r == null) { if (String.IsNullOrEmpty(LastResult)) LastResult = "Completed"; LastStatus = JobStatus.Completed; } else if (r.Error != null) { LastResult = r.Error.Message; LastStatus = JobStatus.Error; Trace.TraceError(r.Error.ToString()); } else { if (r.Message != null) LastResult = r.Message.ToString(); LastStatus = JobStatus.Completed; } } catch (Exception ex) { LastResult = ex.Message; LastStatus = JobStatus.Error; Trace.TraceError(ex.ToString()); } finally { Interlocked.Decrement(ref JobManager.JobsRunning); LastRunFinishTime = DateTime.Now; if (!_keepAlive) _instance = null; try { if (_jobHistoryProvider != null) _jobHistoryProvider.SaveHistory(this); } catch (Exception ex) { Trace.TraceError("Error saving job history: " + ex.Message); } JobManager.Current.OnJobCompleted( new JobCompletedEventArgs( Name, JobAction.Completed, _id, started, LastRunFinishTime, LastResult, LastStatus)); Status = JobStatus.Waiting; IsBusy = false; } } // release job lock }
/// <summary> /// Runs this job and waits for it to return. /// </summary> /// <param name="context">The job context.</param> /// <param name="token">The cancellation token used to cancel the job from running.</param> /// <returns> /// A <see cref="JobResult"/> instance indicating the results of the job. /// </returns> public JobResult Run(JobRunContext context = null, CancellationToken? token = null) { return RunAsync(context, token).Result; }
/// <summary> /// Runs this job. /// </summary> /// <param name="context">The job context.</param> /// <param name="token">The cancellation token used to cancel the job from running.</param> /// <returns> /// A <see cref="JobResult"/> instance indicating the results of the job. /// </returns> public Task<JobResult> RunAsync(JobRunContext context = null, CancellationToken? token = null) { Context = context ?? JobRunContext.Default; CancellationToken = token ?? CancellationToken.None; return RunInternalAsync(); }
private void RunInternal() { if (IsBusy) { return; } IsBusy = true; // get lock using (var jobLock = _jobLockProvider.Acquire(Name)) { // give up if no lock if (!jobLock.LockAcquired) { LastResult = "Could not acquire a job lock."; LastStatus = JobStatus.Canceled; Status = JobStatus.Waiting; IsBusy = false; return; } DateTime started = DateTime.Now; LastRunStartTime = started; JobManager.Current.OnJobRunning(new JobEventArgs(Name, JobAction.Running, _id)); Status = JobStatus.Running; Interlocked.Increment(ref JobManager.JobsRunning); try { CreateInstance(); var context = new JobRunContext(UpdateStatus); var task = _instance.RunAsync(context); task.Wait(); JobResult r = task.Result; if (task.IsFaulted && task.Exception != null) { LastResult = task.Exception.Message; } else if (r == null) { if (String.IsNullOrEmpty(LastResult)) { LastResult = "Completed"; } LastStatus = JobStatus.Completed; } else if (r.Error != null) { LastResult = r.Error.Message; LastStatus = JobStatus.Error; Trace.TraceError(r.Error.ToString()); } else { if (r.Message != null) { LastResult = r.Message.ToString(); } LastStatus = JobStatus.Completed; } } catch (Exception ex) { LastResult = ex.Message; LastStatus = JobStatus.Error; Trace.TraceError(ex.ToString()); } finally { Interlocked.Decrement(ref JobManager.JobsRunning); LastRunFinishTime = DateTime.Now; if (!_keepAlive) { _instance = null; } try { if (_jobHistoryProvider != null) { _jobHistoryProvider.SaveHistory(this); } } catch (Exception ex) { Trace.TraceError("Error saving job history: " + ex.Message); } JobManager.Current.OnJobCompleted( new JobCompletedEventArgs( Name, JobAction.Completed, _id, started, LastRunFinishTime, LastResult, LastStatus)); Status = JobStatus.Waiting; IsBusy = false; } } // release job lock }
/// <summary> /// Runs this job and waits for it to return. /// </summary> /// <param name="context">The job context.</param> /// <param name="token">The cancellation token used to cancel the job from running.</param> /// <returns> /// A <see cref="JobResult"/> instance indicating the results of the job. /// </returns> public JobResult Run(JobRunContext context = null, CancellationToken?token = null) { return(RunAsync(context, token).Result); }
/// <summary> /// Runs this job. /// </summary> /// <param name="context">The job context.</param> /// <returns> /// A <see cref="JobResult"/> instance indicating the results of the job. /// </returns> public virtual Task <JobResult> RunAsync(JobRunContext context) { return(Task.FromResult(JobResult.Success)); }