Example #1
0
 /// <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);
 }
Example #6
0
        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
        }
Example #7
0
 /// <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;
 }
Example #8
0
        /// <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();
        }
Example #9
0
        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
        }
Example #10
0
 /// <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);
 }
Example #11
0
 /// <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));
 }