예제 #1
0
        /// <summary>
        /// 记录任务运行结果
        /// </summary>
        /// <param name="jobId">任务Id</param>
        /// <param name="jobAction">任务执行动作</param>
        /// <param name="blresultTag">任务执行结果表示,true成功,false失败,初始执行为true</param>
        /// <param name="msg">任务记录描述</param>
        public void RecordRun(string jobId, JobAction jobAction, bool blresultTag = true, string msg = "")
        {
            DateTime    addTime = DateTime.Now;
            TaskManager job     = _repository.GetSingle(jobId);

            if (job == null)
            {
                _taskJobsLogService.Insert(new TaskJobsLog
                {
                    Id          = GuidUtils.CreateNo(),
                    CreatorTime = DateTime.Now,
                    TaskId      = jobId,
                    TaskName    = "",
                    JobAction   = jobAction.ToString(),
                    Status      = false,
                    Description = $"未能找到定时任务:{jobId}"
                });
                return;
            }
            string resultStr = string.Empty, strDesc = string.Empty;

            if (!blresultTag)
            {
                job.ErrorCount++;
                job.LastErrorTime = addTime;
                strDesc           = $"异常," + msg;
            }
            else
            {
                strDesc = $"正常," + msg;
            }
            if (jobAction == JobAction.开始)
            {
                job.RunCount++;
                job.LastRunTime = addTime;

                CronExpression cronExpression = new CronExpression(job.Cron);
                job.NextRunTime = cronExpression.GetNextValidTimeAfter(addTime).ToDateTime();
            }
            _repository.Update(job, jobId);

            _taskJobsLogService.Insert(new TaskJobsLog
            {
                Id          = GuidUtils.CreateNo(),
                CreatorTime = DateTime.Now,
                TaskId      = job.Id,
                TaskName    = job.TaskName,
                JobAction   = jobAction.ToString(),
                Status      = blresultTag,
                Description = strDesc
            });
        }
예제 #2
0
 public static void WriteJobAction(JobAction jobAction, string taskName, string groupName,
                                   string content = null)
 {
     content =
         $"{jobAction.ToString()} --  {DateTime.Now:yyyy-MM-dd HH:mm:ss}  --分组:{groupName},作业:{taskName},消息:{content ?? "OK"}\r\n";
     FileHelper.WriteFile(LogPath, "action.txt", content, true);
 }
예제 #3
0
        /// <summary>
        /// 触发新增、删除、修改、暂停、启用、立即执行事件
        /// </summary>
        /// <param name="schedulerFactory"></param>
        /// <param name="taskName"></param>
        /// <param name="groupName"></param>
        /// <param name="action"></param>
        /// <param name="taskOptions"></param>
        /// <returns></returns>
        public static async Task <object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions taskOptions = null)
        {
            string errorMsg = "";

            try
            {
                IScheduler scheduler = await schedulerFactory.GetScheduler();

                List <JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(groupName)).Result.ToList();
                if (jobKeys == null || jobKeys.Count() == 0)
                {
                    errorMsg = $"未找到分组[{groupName}]";
                    return(new { status = false, msg = errorMsg });
                }
                JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault();
                if (jobKey == null)
                {
                    errorMsg = $"未找到触发器[{taskName}]";
                    return(new { status = false, msg = errorMsg });
                }
                var triggers = await scheduler.GetTriggersOfJob(jobKey);

                ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault();

                if (trigger == null)
                {
                    errorMsg = $"未找到触发器[{taskName}]";
                    return(new { status = false, msg = errorMsg });
                }
                object result = null;
                switch (action)
                {
                case JobAction.除:
                case JobAction.修改:
                    await scheduler.PauseTrigger(trigger.Key);

                    await scheduler.UnscheduleJob(trigger.Key);    // 移除触发器

                    await scheduler.DeleteJob(trigger.JobKey);

                    result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
                    break;

                case JobAction.暂停:
                case JobAction.停止:
                case JobAction.开启:
                    result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
                    if (action == JobAction.暂停)
                    {
                        await scheduler.PauseTrigger(trigger.Key);
                    }
                    else if (action == JobAction.开启)
                    {
                        await scheduler.ResumeTrigger(trigger.Key);

                        //   await scheduler.RescheduleJob(trigger.Key, trigger);
                    }
                    else
                    {
                        await scheduler.Shutdown();
                    }
                    break;

                case JobAction.立即执行:
                    await scheduler.TriggerJob(jobKey);

                    break;
                }
                return(result ?? new { status = true, msg = $"作业{action.ToString()}成功" });
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
                return(new { status = false, msg = ex.Message });
            }
            finally
            {
                FileQuartz.WriteJobAction(action, taskName, groupName, errorMsg);
            }
        }
예제 #4
0
        /// <summary>
        /// 触发新增、删除、修改、暂停、启用、立即执行事件
        /// </summary>
        /// <param name="schedulerFactory"></param>
        /// <param name="taskName"></param>
        /// <param name="groupName"></param>
        /// <param name="action"></param>
        /// <param name="taskOptions"></param>
        /// <returns></returns>
        private async Task <AjaxResponse> TriggerAction(string taskName, string groupName, JobAction action, TaskOptions taskOptions = null)
        {
            string errorMsg = "";

            try
            {
                IScheduler scheduler = await _schedulerFactory.GetScheduler();

                List <JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(groupName)).Result.ToList();
                if (jobKeys == null || jobKeys.Count() == 0)
                {
                    errorMsg = $"未找到分组[{groupName}]";
                    return(new AjaxResponse(false, errorMsg));
                }
                JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault();
                if (jobKey == null)
                {
                    errorMsg = $"未找到触发器[{taskName}]";
                    return(new AjaxResponse(false, errorMsg));
                }
                IReadOnlyCollection <ITrigger> triggers = await scheduler.GetTriggersOfJob(jobKey);

                ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault();

                if (trigger == null)
                {
                    errorMsg = $"未找到触发器[{taskName}]";
                    return(new AjaxResponse(false, errorMsg));
                }
                AjaxResponse result = null;
                switch (action)
                {
                case JobAction.除:
                case JobAction.修改:
                    await scheduler.PauseTrigger(trigger.Key);

                    await scheduler.UnscheduleJob(trigger.Key);    // 移除触发器

                    await scheduler.DeleteJob(trigger.JobKey);

                    result = await ModifyTaskEntity(taskOptions, action);

                    break;

                case JobAction.暂停:
                case JobAction.停止:
                case JobAction.开启:
                    result = await ModifyTaskEntity(taskOptions, action);

                    if (action == JobAction.暂停)
                    {
                        await scheduler.PauseTrigger(trigger.Key);
                    }
                    else if (action == JobAction.开启)
                    {
                        await scheduler.ResumeTrigger(trigger.Key);
                    }
                    else
                    {
                        await scheduler.Shutdown();
                    }
                    break;

                case JobAction.立即执行:
                    await scheduler.TriggerJob(jobKey);

                    break;
                }
                return(new AjaxResponse(true, $"作业{action.ToString()}成功"));
            }
            catch (Exception ex)
            {
                _logger.LogError($"{groupName}--{taskName},的{action}错误", ex);
                errorMsg = ex.Message;
                return(new AjaxResponse(false, ex.Message));
            }
        }
예제 #5
0
 public static void WriteJobAction(JobAction jobAction, string taskName, string groupName, string content = null)
 {
     //TODO:向数据库写入作业执行状态
     content = $"{jobAction.ToString()} --  {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}  --分组:{groupName},作业:{taskName},消息:{content ?? "OK"}\r\n";
     FileHelper.WriteFile(FileQuartz.LogPath, "action.txt", content, true);
 }