Exemple #1
0
        public Task InsertAsync(BackgroundJobInfo jobInfo)
        {
            jobInfo.Id       = Interlocked.Increment(ref lastId);
            jobs[jobInfo.Id] = jobInfo;

            return(Task.FromResult(0));
        }
Exemple #2
0
        public Task UpdateAsync(BackgroundJobInfo jobInfo)
        {
            if (jobInfo.IsAbandoned)
            {
                return(DeleteAsync(jobInfo));
            }

            return(Task.FromResult(0));
        }
Exemple #3
0
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            if (!jobs.ContainsKey(jobInfo.Id))
            {
                return(Task.FromResult(0));
            }

            jobs.Remove(jobInfo.Id);

            return(Task.FromResult(0));
        }
Exemple #4
0
 private void TryUpdate(BackgroundJobInfo jobInfo)
 {
     try
     {
         store.UpdateAsync(jobInfo);
     }
     catch (Exception updateEx)
     {
         Logger.Warn(updateEx.ToString(), updateEx);
     }
 }
Exemple #5
0
        public async Task EnqueueAsync <TJob, TArgs>(TArgs args,
                                                     BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan?delay = null)
            where TJob : IBackgroundJob <TArgs>
        {
            var jobInfo = new BackgroundJobInfo
            {
                JobType  = typeof(TJob).AssemblyQualifiedName,
                JobArgs  = args.ToJsonString(),
                Priority = priority
            };

            if (delay.HasValue)
            {
                jobInfo.NextTryTime = Clock.Now.Add(delay.Value);
            }

            await store.InsertAsync(jobInfo);
        }
Exemple #6
0
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return(backgroundJobRepository.UpdateAsync(jobInfo));
 }
Exemple #7
0
 public Task DeleteAsync(BackgroundJobInfo jobInfo)
 {
     return(backgroundJobRepository.DeleteAsync(jobInfo));
 }
Exemple #8
0
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return(backgroundJobRepository.InsertAsync(jobInfo));
 }
Exemple #9
0
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return(Task.FromResult(0));
 }
Exemple #10
0
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return(Task.FromResult(0));
 }
Exemple #11
0
        private void TryProcessJob(BackgroundJobInfo jobInfo)
        {
            try
            {
                jobInfo.TryCount++;
                jobInfo.LastTryTime = Clock.Now;

                var jobType = Type.GetType(jobInfo.JobType);
                using (var job = iocResolver.ResolveAsDisposable(jobType))
                {
                    try
                    {
                        var jobExecuteMethod = job.Object.GetType().GetTypeInfo().GetMethod("Execute");
                        var argsType         = jobExecuteMethod.GetParameters()[0].ParameterType;
                        var argsObj          = JsonConvert.DeserializeObject(jobInfo.JobArgs, argsType);

                        jobExecuteMethod.Invoke(job.Object, new[] { argsObj });

                        AsyncHelper.RunSync(() => store.DeleteAsync(jobInfo));
                    }
                    catch (Exception ex)
                    {
                        Logger.Warn(ex.Message, ex);

                        var nextTryTime = jobInfo.CalculateNextTryTime();
                        if (nextTryTime.HasValue)
                        {
                            jobInfo.NextTryTime = nextTryTime.Value;
                        }
                        else
                        {
                            jobInfo.IsAbandoned = true;
                        }

                        TryUpdate(jobInfo);

                        EventBus.Trigger(
                            this,
                            new StudioXHandledExceptionData(
                                new BackgroundJobException(
                                    "A background job execution is failed. See inner exception for details. See BackgroundJob property to get information on the background job.",
                                    ex
                                    )
                        {
                            BackgroundJob = jobInfo,
                            JobObject     = job.Object
                        }
                                )
                            );
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex.ToString(), ex);

                jobInfo.IsAbandoned = true;

                TryUpdate(jobInfo);
            }
        }