Exemplo n.º 1
0
        /// <summary>
        /// 触发任务
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <object> HandleRun(HttpContext context)
        {
            var res = ReturnT.Success();

            try
            {
                var jobInfo = await context.Request.FromBody <JobRunRequest>();

                //_logger.LogInformation($"--------------触发任务{JsonUtils.ToJson(jobInfo)}--------------");
                //获取jobhandler并执行
                var jobHandler = _jobHandlerManage.GetJobHandler(jobInfo.executorHandler);
                if (jobHandler == null)
                {
                    throw new Exception($"没有对应的JobHandler,{jobInfo.executorHandler}");
                }

                //处理执行器策略 默认是串行执行
                Enum.TryParse(jobInfo.executorBlockStrategy, out ExecutorBlockStrategy blockStrategy);
                if (blockStrategy == ExecutorBlockStrategy.DISCARD_LATER) //如果有积压任务,丢弃当前任务
                {
                    if (_xxlJobExecutor.IsRunningOrHasQueue(jobInfo.jobId))
                    {
                        return(ReturnT.Failed("终止任务[执行策略: DISCARD_LATER]"));
                    }
                }
                else if (blockStrategy == ExecutorBlockStrategy.COVER_EARLY) //覆盖之前调度 负载之前积压的任务
                {
                    if (_xxlJobExecutor.IsRunningOrHasQueue(jobInfo.jobId))
                    {
                        _xxlJobExecutor.KillJob(jobInfo.jobId, "终止任务[执行策略:COVER_EARLY]"); //停止该jogid对应的所有积压的任务(已经在执行中的就停止不了)
                    }
                }

                await AsyncExecuteJob(jobInfo, jobHandler);
            }
            catch (Exception ex)
            {
                res = ReturnT.Failed(ex.StackTrace + "————" + ex.Message);
                _logger.LogError(ex, "xxljob触发任务错误");
            }
            return(res);
        }