/// <summary>
        /// Job新增
        /// </summary>
        /// <param name="backgroundJobInfo">BackgroundJobInfo实体</param>
        /// <returns></returns>
        public bool InsertBackgroundJob(BackgroundJobInfo backgroundJobInfo)
        {
            backgroundJobInfo.CreatedDateTime     = DateTime.Now;
            backgroundJobInfo.LastUpdatedDateTime = DateTime.Now;

            return(db.Insertable(backgroundJobInfo).ExecuteCommand() > 0);
        }
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     jobInfo.Id = Interlocked.Increment(ref _lastId);
     _jobs.Add(jobInfo);
     
     return Task.FromResult(0);
 }
示例#3
0
        /// <summary>
        /// Job删除
        /// </summary>
        /// <param name="idList">ID集合</param>
        /// <returns></returns>
        public bool DeleteBackgroundJob(List <System.Guid> idList, out string rtMsg)
        {
            bool result = false;

            rtMsg = string.Empty;
            int i = 0;

            if (idList != null && idList.Count > 0)
            {
                foreach (System.Guid BackgroundJobId in idList)
                {
                    BackgroundJobInfo backgroundJobInfo = GetBackgroundJobInfo(BackgroundJobId);
                    if (backgroundJobInfo.State != 0)
                    {
                        rtMsg = string.Format("{0}状态不为 停止状态,无法进行删除!", backgroundJobInfo.Name);
                        return(false);
                    }
                }

                foreach (System.Guid BackgroundJobId in idList)
                {
                    DeleteBackgroundJob(BackgroundJobId);
                    i++;
                }
            }
            result = i > 0;
            return(result);
        }
示例#4
0
        protected override async Task <Guid> EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan?delay = null)
        {
            var id = GuidGenerator.Create();

            if (args is BackgroundJobArgs)
            {
                (args as BackgroundJobArgs).Id = id;
            }
            var jobInfo = new BackgroundJobInfo
            {
                Id           = id,
                JobName      = jobName,
                JobArgs      = Serializer.Serialize(args),
                Priority     = priority,
                CreationTime = Clock.Now,
                NextTryTime  = Clock.Now
            };

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

            await Store.InsertAsync(jobInfo);

            return(jobInfo.Id);
        }
示例#5
0
        /// <summary>
        /// Job调度
        /// </summary>
        /// <param name="scheduler"></param>
        /// <param name="jobInfo"></param>
        public void ScheduleJob(IScheduler scheduler, BackgroundJobInfo jobInfo)
        {
            if (ValidExpression(jobInfo.CronExpression))
            {
                Type type = GetClassInfo(jobInfo.AssemblyName, jobInfo.ClassName);
                if (type != null)
                {
                    IJobDetail job = new JobDetailImpl(jobInfo.BackgroundJobId.ToString(), jobInfo.BackgroundJobId.ToString() + "Group", type);
                    job.JobDataMap.Add("Parameters", jobInfo.JobArgs);
                    job.JobDataMap.Add("JobName", jobInfo.Name);

                    CronTriggerImpl trigger = new CronTriggerImpl();
                    trigger.CronExpressionString = jobInfo.CronExpression;
                    trigger.Name         = jobInfo.BackgroundJobId.ToString();
                    trigger.Description  = jobInfo.Description;
                    trigger.StartTimeUtc = DateTime.UtcNow;
                    trigger.Group        = jobInfo.BackgroundJobId + "TriggerGroup";
                    scheduler.ScheduleJob(job, trigger);
                }
                else
                {
                    new BackgroundJobService().WriteBackgroundJoLog(jobInfo.BackgroundJobId, jobInfo.Name, DateTime.Now, jobInfo.AssemblyName + jobInfo.ClassName + "无效,无法启动该任务");
                }
            }
            else
            {
                new BackgroundJobService().WriteBackgroundJoLog(jobInfo.BackgroundJobId, jobInfo.Name, DateTime.Now, jobInfo.CronExpression + "不是正确的Cron表达式,无法启动该任务");
            }
        }
示例#6
0
        public async Task UpdateAsync(BackgroundJobInfo jobInfo)
        {
            var appEnv = Environment.MachineName + "_" + _configuration.AppName;
            var entity = jobInfo.ToJob();

            entity.AppEnv = appEnv;
            await _backJobRepository.UpdateAsync(entity);
        }
示例#7
0
        public ActionResult UpdatePost(BackgroundJobInfo Info)
        {
            var result = new ResponseResult();
            BackgroundJobService _BackgroundJobService = new BackgroundJobService();

            result.success = _BackgroundJobService.UpdateBackgroundJob(Info);
            return(Json(result));
        }
示例#8
0
        /// <summary>
        /// Job修改
        /// </summary>
        /// <param name="backgroundJobInfo">BackgroundJobInfo实体</param>
        /// <returns></returns>
        public bool UpdateBackgroundJob(BackgroundJobInfo backgroundJobInfo)
        {
            System.Guid BackgroundJobId = backgroundJobInfo.BackgroundJobId;

            backgroundJobInfo.LastUpdatedDateTime = DateTime.Now;
            db.Updateable(backgroundJobInfo).IgnoreColumns(it => new { it.LastRunTime, it.NextRunTime, it.RunCount, it.CreatedByUserId, it.CreatedByUserName, it.CreatedDateTime, it.IsDelete }).Where(it => it.BackgroundJobId == BackgroundJobId).ExecuteCommand();
            return(true);
        }
示例#9
0
 public async Task DeleteAsync(BackgroundJobInfo jobInfo)
 {
     if (jobInfo == null)
     {
         return;
     }
     var appEnv = Environment.MachineName + "_" + _configuration.AppName;
     await _backJobRepository.DeleteAsync(x => x.Id == jobInfo.Id && x.AppEnv == appEnv);
 }
示例#10
0
    public virtual Task UpdateAsync(BackgroundJobInfo jobInfo)
    {
        if (jobInfo.IsAbandoned)
        {
            return(DeleteAsync(jobInfo.Id));
        }

        return(Task.CompletedTask);
    }
示例#11
0
    public virtual Task UpdateAsync(BackgroundJobInfo jobInfo)
    {
        if (jobInfo.IsAbandoned)
        {
            return(DeleteAsync(jobInfo.Id));
        }

        return(Task.FromResult(0));
    }
示例#12
0
        /// <summary>
        /// 更新Job状态
        /// </summary>
        /// <param name="BackgroundJobId">Job ID</param>
        /// <param name="State">状态</param>
        /// <returns></returns>
        public bool UpdateBackgroundJobState(System.Guid BackgroundJobId, int State)
        {
            BackgroundJobInfo backgroundJobInfo = new BackgroundJobInfo();

            backgroundJobInfo.BackgroundJobId = BackgroundJobId;
            backgroundJobInfo.State           = State;
            db.Updateable(backgroundJobInfo).UpdateColumns(it => new { it.State }).Where(it => it.BackgroundJobId == BackgroundJobId).ExecuteCommand();
            return(true);
        }
        /// <summary>
        /// 更新工作-异步
        /// </summary>
        /// <param name="jobInfo">后台工作信息</param>
        /// <returns></returns>
        public Task UpdateAsync(BackgroundJobInfo jobInfo)
        {
            if (jobInfo.IsAbandoned)
            {
                return DeleteAsync(jobInfo);
            }

            return Task.FromResult(0);
        }
示例#14
0
        public ActionResult AddPost(BackgroundJobInfo Info)
        {
            var result = new ResponseResult();
            BackgroundJobService _BackgroundJobService = new BackgroundJobService();

            Info.BackgroundJobId = System.Guid.NewGuid();
            result.success       = _BackgroundJobService.InsertBackgroundJob(Info);
            return(Json(result));
        }
示例#15
0
        /// <summary>
        /// Job删除
        /// </summary>
        /// <param name="BackgroundJobId">Job ID</param>
        /// <returns></returns>
        public bool DeleteBackgroundJob(System.Guid BackgroundJobId)
        {
            BackgroundJobInfo backgroundJobInfo = new BackgroundJobInfo();

            backgroundJobInfo.BackgroundJobId     = BackgroundJobId;
            backgroundJobInfo.IsDelete            = 1;
            backgroundJobInfo.LastUpdatedDateTime = DateTime.Now;
            db.Updateable(backgroundJobInfo).UpdateColumns(it => new { it.IsDelete, it.LastUpdatedDateTime }).Where(it => it.BackgroundJobId == BackgroundJobId).ExecuteCommand();
            return(true);
        }
示例#16
0
        public async Task InsertAsync(BackgroundJobInfo jobInfo)
        {
            var appEnv = Environment.MachineName + "_" + _configuration.AppName;
            var entity = jobInfo.ToJob();

            entity.AppEnv = appEnv;
            var id = await _backJobRepository.InsertAndGetIdAsync(entity);

            jobInfo.Id = id;
        }
        /// <summary>
        /// 删除工作-异步
        /// </summary>
        /// <param name="jobInfo">后台工作信息</param>
        /// <returns></returns>
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            if (!_jobs.ContainsKey(jobInfo.Id))
            {
                return Task.FromResult(0);
            }

            _jobs.Remove(jobInfo.Id);

            return Task.FromResult(0);
        }
示例#18
0
 private async Task TryUpdateAsync(BackgroundJobInfo jobInfo)
 {
     try
     {
         await _store.UpdateAsync(jobInfo);
     }
     catch (Exception updateEx)
     {
         Logger.Warn(updateEx.ToString(), updateEx);
     }
 }
示例#19
0
 protected virtual async Task TryUpdateAsync(IBackgroundJobStore store, BackgroundJobInfo jobInfo)
 {
     try
     {
         await store.UpdateAsync(jobInfo);
     }
     catch (Exception updateEx)
     {
         Logger.LogException(updateEx);
     }
 }
示例#20
0
    public virtual async Task UpdateAsync(BackgroundJobInfo jobInfo)
    {
        var backgroundJobRecord = await BackgroundJobRepository.FindAsync(jobInfo.Id);

        if (backgroundJobRecord == null)
        {
            return;
        }

        ObjectMapper.Map(jobInfo, backgroundJobRecord);
        await BackgroundJobRepository.UpdateAsync(backgroundJobRecord);
    }
示例#21
0
 public async Task Test_All()
 {
     var jobInfo = new BackgroundJobInfo
     {
         JobType = "TestType",
         JobArgs = "{}"
     };
     
     await _store.InsertAsync(jobInfo);
     (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(1);
     await _store.DeleteAsync(jobInfo);
     (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(0);
 }
 public async Task Test_All()
 {
     var jobInfo = new BackgroundJobInfo
     {
         JobType = "TestType",
         JobArgs = "{}"
     };
     
     await _store.InsertAsync(jobInfo);
     (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(1);
     await _store.DeleteAsync(jobInfo);
     (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(0);
 }
示例#23
0
    protected virtual DateTime?CalculateNextTryTime(BackgroundJobInfo jobInfo, IClock clock)
    {
        var nextWaitDuration = WorkerOptions.DefaultFirstWaitDuration *
                               (Math.Pow(WorkerOptions.DefaultWaitFactor, jobInfo.TryCount - 1));
        var nextTryDate = jobInfo.LastTryTime?.AddSeconds(nextWaitDuration) ??
                          clock.Now.AddSeconds(nextWaitDuration);

        if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > WorkerOptions.DefaultTimeout)
        {
            return(null);
        }

        return(nextTryDate);
    }
示例#24
0
        /// <summary>
        /// 更新Job状态
        /// </summary>
        /// <param name="backgroundJobId">Job ID</param>
        /// <param name="state">状态:0停止,1运行,3正在启动中,5停止中</param>
        /// <returns></returns>
        public bool UpdateBackgroundJobState(Guid backgroundJobId, int state)
        {
            var backgroundJobInfo = new BackgroundJobInfo()
            {
                BackgroundJobId = backgroundJobId,
                State           = state
            };

            db.Updateable(backgroundJobInfo)
            .UpdateColumns(it => new { it.State })
            .Where(it => it.BackgroundJobId == backgroundJobId)
            .ExecuteCommand();

            return(true);
        }
示例#25
0
 public static BackJob ToJob(this BackgroundJobInfo info)
 {
     return(new BackJob
     {
         CreationTime = info.CreationTime,
         CreatorUserId = info.CreatorUserId,
         Id = info.Id,
         IsAbandoned = info.IsAbandoned,
         JobArgs = info.JobArgs,
         JobType = info.JobType,
         LastTryTime = info.LastTryTime,
         NextTryTime = info.NextTryTime,
         Priority = info.Priority,
         TryCount = info.TryCount,
     });
 }
示例#26
0
    public async Task InsertAsync()
    {
        var jobInfo = new BackgroundJobInfo
        {
            Id      = Guid.NewGuid(),
            JobArgs = "args1",
            JobName = "name1"
        };

        await _backgroundJobStore.InsertAsync(
            jobInfo
            );

        var jobInfo2 = await _backgroundJobStore.FindAsync(jobInfo.Id);

        jobInfo2.ShouldNotBeNull();
        jobInfo2.Id.ShouldBe(jobInfo.Id);
        jobInfo2.JobArgs.ShouldBe(jobInfo.JobArgs);
        jobInfo2.JobName.ShouldBe(jobInfo.JobName);
    }
    public static string Serialize(BackgroundJobInfo info)
    {
        MySurrogate            mySurrogate            = new MySurrogate();
        DataContractSerializer dataContractSerializer =
            new DataContractSerializer(
                typeof(BackgroundJobInfo),
                null,
                64 * 1024,
                true,
                true,
                mySurrogate);
        var stringBuilder = new StringBuilder();

        using (var stringWriter = new StringWriter(stringBuilder, CultureInfo.InvariantCulture))
        {
            var writer = new XmlTextWriter(stringWriter);
            dataContractSerializer.WriteObject(writer, info);
        }
        return(stringBuilder.ToString());
    }
示例#28
0
        public virtual string Enqueue <TJob, TArgs>(TArgs args,
                                                    BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan?delay = null)
            where TJob : IBackgroundJobBase <TArgs>
        {
            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();

            return(jobInfo.Id.ToString());
        }
示例#29
0
        public async Task Test_All()
        {
            var jobInfo = new BackgroundJobInfo
            {
                JobType = "TestType",
                JobArgs = "{}"
            };

            await _store.InsertAsync(jobInfo);

            (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(1);

            var jobInfoFromStore = await _store.GetAsync(1);

            jobInfoFromStore.ShouldNotBeNull();
            jobInfoFromStore.JobType.ShouldBeSameAs(jobInfo.JobType);
            jobInfoFromStore.JobArgs.ShouldBeSameAs(jobInfo.JobArgs);

            await _store.DeleteAsync(jobInfo);

            (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(0);
        }
        public async Task Test_All()
        {
            var jobInfo = new BackgroundJobInfo
            {
                JobType     = "TestType",
                JobArgs     = "{}",
                NextTryTime = Clock.Now.AddMinutes(-1) // to be sure NextTryTime will not be same when _store.InsertAsync and _store.GetWaitingJobsAsync are executed.
            };

            await _store.InsertAsync(jobInfo);

            (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(1);

            var jobInfoFromStore = await _store.GetAsync(1);

            jobInfoFromStore.ShouldNotBeNull();
            jobInfoFromStore.JobType.ShouldBeSameAs(jobInfo.JobType);
            jobInfoFromStore.JobArgs.ShouldBeSameAs(jobInfo.JobArgs);

            await _store.DeleteAsync(jobInfo);

            (await _store.GetWaitingJobsAsync(1000)).Count.ShouldBe(0);
        }
示例#31
0
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return(_unitOfWorkManager.PerformAsyncUow <Task>(() => _backgroundJobRepository.UpdateAsync(jobInfo)));
 }
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return _backgroundJobRepository.InsertAsync(jobInfo);
 }
 public Task DeleteAsync(BackgroundJobInfo jobInfo)
 {
     return _backgroundJobRepository.DeleteAsync(jobInfo);
 }
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return _backgroundJobRepository.UpdateAsync(jobInfo);
 }
 public Task InsertAsync(BackgroundJobInfo jobInfo)
 {
     return Task.FromResult(0);
 }
示例#36
0
 /// <summary>
 /// Job修改
 /// </summary>
 /// <param name="backgroundJobInfo">BackgroundJobInfo实体</param>
 /// <returns></returns>
 public bool UpdateBackgroundJob(BackgroundJobInfo backgroundJobInfo)
 {
     return(new BackgroundJobManager().UpdateBackgroundJob(backgroundJobInfo));
 }
示例#37
0
 /// <summary>
 /// Job新增
 /// </summary>
 /// <param name="backgroundJobInfo">BackgroundJobInfo实体</param>
 /// <returns></returns>
 public bool InsertBackgroundJob(BackgroundJobInfo backgroundJobInfo)
 {
     return(new BackgroundJobManager().InsertBackgroundJob(backgroundJobInfo));
 }
        public Task DeleteAsync(BackgroundJobInfo jobInfo)
        {
            _jobs.Remove(jobInfo);

            return Task.FromResult(0);
        }
 public Task UpdateAsync(BackgroundJobInfo jobInfo)
 {
     return Task.FromResult(0);            
 }
示例#40
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))
                        {
                            Task  result = (Task)jobExecuteMethod.Invoke(job.Object, new[] { argsObj });
                            await result;
                        }
                        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);
            }
        }