示例#1
0
 public void Update(BackgroundJobInfo jobInfo)
 {
     if (jobInfo.IsAbandoned)
     {
         Delete(jobInfo);
     }
 }
 public void Delete(BackgroundJobInfo jobInfo)
 {
     _unitOfWorkManager.WithUnitOfWork(() =>
     {
         _backgroundJobRepository.Delete(jobInfo);
     });
 }
示例#3
0
        public virtual string Enqueue <TJob, TArgs>(TArgs args,
                                                    BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan?delay = null)
            where TJob : IBackgroundJobBase <TArgs>
        {
            string jobInfoId;

            using (var uow = UnitOfWorkManager.Begin())
            {
                var jobInfo = new BackgroundJobInfo
                {
                    JobType  = typeof(TJob).AssemblyQualifiedName,
                    JobArgs  = args.ToJsonString(),
                    Priority = priority
                };

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

                _store.Insert(jobInfo);
                CurrentUnitOfWork.SaveChanges();

                jobInfoId = jobInfo.Id.ToString();

                uow.Complete();
            }

            return(jobInfoId);
        }
 public void Insert(BackgroundJobInfo jobInfo)
 {
     _unitOfWorkManager.WithUnitOfWork(() =>
     {
         _backgroundJobRepository.Insert(jobInfo);
     });
 }
        public Task InsertAsync(BackgroundJobInfo jobInfo)
        {
            jobInfo.Id = Interlocked.Increment(ref _lastId);
            _jobs.Add(jobInfo);

            return(Task.FromResult(0));
        }
示例#6
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().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 AbpHandledExceptionData(
                                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
                        }
                                )
                            );
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex.ToString(), ex);

                jobInfo.IsAbandoned = true;

                TryUpdate(jobInfo);
            }
        }
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            BackgroundJobInfo _;

            _jobs.TryRemove(jobInfo.Id, out _);

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

            return(Task.FromResult(0));
        }
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            if (!_jobs.ContainsKey(jobInfo.Id))
            {
                return(Task.FromResult(0));
            }

            _jobs.Remove(jobInfo.Id);

            return(Task.FromResult(0));
        }
示例#10
0
 private async Task TryUpdateAsync(BackgroundJobInfo jobInfo)
 {
     try
     {
         await _store.UpdateAsync(jobInfo);
     }
     catch (Exception updateEx)
     {
         Logger.Warn(updateEx.ToString(), updateEx);
     }
 }
示例#11
0
 private void TryUpdate(BackgroundJobInfo jobInfo)
 {
     try
     {
         _store.UpdateAsync(jobInfo);
     }
     catch (Exception updateEx)
     {
         Logger.Warn(updateEx.ToString(), updateEx);
     }
 }
示例#12
0
        public bool Delete(string jobId)
        {
            if (long.TryParse(jobId, out long finalJobId) == false)
            {
                throw new ArgumentException($"The jobId '{jobId}' should be a number.", nameof(jobId));
            }

            BackgroundJobInfo jobInfo = _store.Get(finalJobId);

            _store.Delete(jobInfo);
            return(true);
        }
        public async Task <bool> DeleteAsync(string jobId)
        {
            if (long.TryParse(jobId, out long finalJobId) == false)
            {
                throw new ArgumentException($"The jobId '{jobId}' should be a number.", nameof(jobId));
            }

            BackgroundJobInfo jobInfo = await _store.GetAsync(finalJobId);

            await _store.DeleteAsync(jobInfo);

            return(true);
        }
示例#14
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().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);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex.ToString(), ex);

                jobInfo.IsAbandoned = true;

                TryUpdate(jobInfo);
            }
        }
示例#15
0
        /// <summary>
        /// 将工作插入到队列中
        /// </summary>
        /// <typeparam name="TJob"></typeparam>
        /// <typeparam name="TArgs"></typeparam>
        /// <param name="args"></param>
        /// <param name="priority"></param>
        /// <param name="delay"></param>
        /// <returns></returns>
        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);
        }
        public virtual async Task <string> 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);

            await CurrentUnitOfWork.SaveChangesAsync();

            return(jobInfo.Id.ToString());
        }
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            _jobs.Remove(jobInfo);

            return(Task.FromResult(0));
        }
 public async Task DeleteAsync(BackgroundJobInfo jobInfo)
 {
     await _unitOfWorkManager.WithUnitOfWorkAsync(async() =>
                                                  await _backgroundJobRepository.DeleteAsync(jobInfo)
                                                  );
 }
示例#19
0
 public void Insert(BackgroundJobInfo jobInfo)
 {
     _backgroundJobRepository.Insert(jobInfo);
 }
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return(_backgroundJobRepository.UpdateAsync(jobInfo));
 }
 public Task DeleteAsync(BackgroundJobInfo jobInfo)
 {
     return(_backgroundJobRepository.DeleteAsync(jobInfo));
 }
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return(_backgroundJobRepository.InsertAsync(jobInfo));
 }
示例#23
0
 public void Delete(BackgroundJobInfo jobInfo)
 {
     _backgroundJobRepository.Delete(jobInfo);
 }
示例#24
0
        private async Task TryProcessJobAsync(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(nameof(IBackgroundJob <object> .Execute)) ??
                                               job.Object.GetType().GetTypeInfo()
                                               .GetMethod(nameof(IAsyncBackgroundJob <object> .ExecuteAsync));

                        if (jobExecuteMethod == null)
                        {
                            throw new AbpException(
                                      $"Given job type does not implement {typeof(IBackgroundJob<>).Name} or {typeof(IAsyncBackgroundJob<>).Name}. " +
                                      "The job type was: " + job.Object.GetType());
                        }

                        var argsType = jobExecuteMethod.GetParameters()[0].ParameterType;
                        var argsObj  = JsonConvert.DeserializeObject(jobInfo.JobArgs, argsType);

                        if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob <object> .ExecuteAsync))
                        {
                            await((Task)jobExecuteMethod.Invoke(job.Object, new[] { argsObj }));
                        }
                        else
                        {
                            jobExecuteMethod.Invoke(job.Object, new[] { argsObj });
                        }

                        await _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;
                        }

                        await TryUpdateAsync(jobInfo);

                        await EventBus.TriggerAsync(
                            this,
                            new AbpHandledExceptionData(
                                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;

                await TryUpdateAsync(jobInfo);
            }
        }
示例#25
0
 public void Update(BackgroundJobInfo jobInfo)
 {
     _backgroundJobRepository.Update(jobInfo);
 }
 public void Insert(BackgroundJobInfo jobInfo)
 {
 }
示例#27
0
 /// <summary>
 /// 更新一个作业
 /// </summary>
 /// <param name="jobInfo">作业信息</param>
 /// <returns></returns>
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return(Task.FromResult(0));
 }
示例#28
0
 /// <summary>
 /// 异步插入一个后台作业
 /// </summary>
 /// <param name="jobInfo">作业信息</param>
 /// <returns></returns>
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return(Task.FromResult(0));
 }
 public void Delete(BackgroundJobInfo jobInfo)
 {
 }
 public void Update(BackgroundJobInfo jobInfo)
 {
 }