Esempio n. 1
0
        public JsonResult EditTask(QuartzTaskEditModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Json(new MessageData(false, "参数错误!")));
            }

            if (model.Id == 0 && _quartzTaskService.QuartzTasks.Any(n => n.ClassType == model.ClassType))
            {
                return(Json(new MessageData(false, "任务已存在!")));
            }

            try
            {
                QuartzTask task = model.AsQuartzTask();
                if (model.Id > 0)
                {
                    _quartzTaskService.Update(task);
                    DIContainer.Resolve <ITaskScheduler>().SaveTaskStatus(task);
                }
                else
                {
                    _quartzTaskService.Create(task);
                    DIContainer.Resolve <ITaskScheduler>().ResumeAll();
                }
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
                return(Json(new MessageData(false, "提交失败!")));
            }

            return(Json(new MessageData(true, "提交成功!")));
        }
Esempio n. 2
0
        /// <summary>
        /// 转换成QuartzTaskEditModel
        /// </summary>
        /// <returns></returns>
        public static QuartzTaskEditModel AsEditModel(this QuartzTask quartzTask)
        {
            string seconds   = quartzTask.GetRulePart(RulePart.seconds);
            string minutes   = quartzTask.GetRulePart(RulePart.minutes);
            string hours     = quartzTask.GetRulePart(RulePart.hours);
            string day       = quartzTask.GetRulePart(RulePart.day);
            string mouth     = quartzTask.GetRulePart(RulePart.mouth);
            string dayOfWeek = quartzTask.GetRulePart(RulePart.dayofweek) ?? string.Empty;

            string[]      rulePartArray = quartzTask.TaskRule.Split(' ');
            TaskFrequency frequency     = TaskFrequency.EveryDay;

            if ((rulePartArray[3].Contains("/") || rulePartArray[3] == "*") && rulePartArray[4] == "*")
            {
                frequency = TaskFrequency.EveryDay;
            }
            else if (rulePartArray[5] != "?" && !rulePartArray[5].Contains("#"))
            {
                frequency = TaskFrequency.Weekly;
            }
            else
            {
                frequency = TaskFrequency.PerMonth;
            }

            bool dayRepeat = false;

            for (int i = 0; i < 3; i++)
            {
                dayRepeat = rulePartArray[i].Contains("*") || rulePartArray[i].Contains("/");

                if (dayRepeat)
                {
                    break;
                }
            }

            return(new QuartzTaskEditModel()
            {
                TaskName = quartzTask.Name,
                IsRepeat = quartzTask.TaskRule.Contains("/") || quartzTask.TaskRule.Contains("*"),
                Seconds = seconds,
                Minutes = minutes,
                Hours = hours,
                Day = day,
                Mouth = mouth,
                Frequency = frequency,
                DayOrWeekly = !dayOfWeek.Contains("#"),
                DayOfMouth = day,
                WeeklyOfMouth = dayOfWeek.Contains("#") ? dayOfWeek.Substring(0, dayOfWeek.IndexOf("#")) : "2",
                Number = dayOfWeek.Contains("#") ? dayOfWeek.Substring(dayOfWeek.IndexOf("#") + 1) : "1",
                DayOfWeek = dayOfWeek.Contains("#") ? null : dayOfWeek.Split(','),
                DayRepeat = dayRepeat,
                OnceTime = !dayRepeat ? new DateTime(2016, 1, 1, Convert.ToInt32(hours), Convert.ToInt32(minutes), Convert.ToInt32(seconds)) : new DateTime(2016, 1, 1, 1, 0, 0),
                OnceDate = !dayRepeat ? new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(hours), Convert.ToInt32(minutes), Convert.ToInt32(seconds)) : DateTime.Now,
                StartDate = string.IsNullOrEmpty(quartzTask.StartDate.ToString()) ? DateTime.Now : quartzTask.StartDate,
                EndDate = quartzTask.EndDate ?? new DateTime(2099, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second),
                Enabled = quartzTask.Enabled
            });
        }
Esempio n. 3
0
        public ActionResult EditTask(int?id = null)
        {
            QuartzTask quartzTask = null;

            if (id.HasValue)
            {
                quartzTask = _quartzTaskService.FindById(id.Value);
            }
            else
            {
                quartzTask           = new QuartzTask();
                quartzTask.Enabled   = true;
                quartzTask.StartDate = DateTime.Now;
                quartzTask.TaskRule  = "* * * * * ?";
            }

            if (quartzTask == null)
            {
                return(HttpNotFound());
            }

            var classTypes = DIContainer.Resolve <ITypeFinder>().FindClassesOfType <ITask>();

            ViewData["classType"] = classTypes.Select(n => new SelectListItem {
                Text = n.Name, Value = n.FullName, Selected = n.FullName == quartzTask.ClassType
            });
            QuartzTaskEditModel editModel = quartzTask.AsEditModel();

            InitRules(editModel);
            return(View(editModel));
        }
Esempio n. 4
0
        /// <summary>
        /// 运行单个任务
        /// </summary>
        /// <param name="Id">任务Id</param>
        public void Run(int Id)
        {
            QuartzTask task = GetTask(Id);

            Run(task);
            SaveTaskStatus(task);
        }
Esempio n. 5
0
        /// <summary>
        /// 转换为TaskDetailEditModel用于数据库存储
        /// </summary>
        public QuartzTask AsQuartzTask()
        {
            QuartzTask quartzTask = DIContainer.Resolve <IQuartzTaskService>().FindById(Id);

            if (quartzTask == null)
            {
                quartzTask = new QuartzTask();
            }

            quartzTask.Name      = TaskName;
            quartzTask.ClassType = ClassType;
            quartzTask.TaskRule  = GenerateRule();
            quartzTask.StartDate = StartDate;
            quartzTask.EndDate   = EndDate;
            quartzTask.Enabled   = Enabled;

            return(quartzTask);
        }
Esempio n. 6
0
        /// <summary>
        /// 运行单个任务
        /// </summary>
        /// <param name="task">要运行的任务</param>
        public void Run(QuartzTask task)
        {
            if (task == null)
            {
                return;
            }

            Type type = Type.GetType(task.ClassType);

            if (type == null)
            {
                return;
            }

            //任务重复运行检测
            if (task.IsRunning)
            {
                return;
            }

            ITask t = (ITask)Activator.CreateInstance(type);

            if (t != null)
            {
                task.IsRunning = true;
                DateTime lastStart = DateTime.Now;
                try
                {
                    t.Execute();
                    task.LastIsSuccess   = true;
                    task.LastFailMessage = null;
                }
                catch (Exception ex)
                {
                    task.LastIsSuccess   = false;
                    task.LastFailMessage = ex.Message;
                }
                task.IsRunning = false;
                task.LastStart = lastStart;
                task.LastEnd   = DateTime.Now;
                SaveTaskStatus(task);
            }
        }
Esempio n. 7
0
        public void Execute(IJobExecutionContext context)
        {
            int        Id   = context.JobDetail.JobDataMap.GetInt("Id");
            QuartzTask task = TaskSchedulerFactory.GetScheduler().GetTask(Id);

            if (task == null)
            {
                throw new ArgumentException("Not found task :" + task.Name);
            }


            IQuartzTaskService quartzTaskService = DIContainer.Resolve <IQuartzTaskService>();

            task.IsRunning = true;
            DateTime lastStart = DateTime.Now;

            try
            {
                ITask excuteTask = (ITask)Activator.CreateInstance(Type.GetType(task.ClassType));
                excuteTask.Execute(task);
                task.LastIsSuccess = true;
            }
            catch (Exception)
            {
                task.LastIsSuccess = false;
            }

            task.IsRunning = false;

            task.LastStart = lastStart;
            if (context.NextFireTimeUtc.HasValue)
            {
                task.NextStart = context.NextFireTimeUtc.Value.LocalDateTime;
            }
            else
            {
                task.NextStart = null;
            }

            task.LastEnd = DateTime.Now;
            DIContainer.Resolve <ITaskScheduler>().SaveTaskStatus(task);
        }
Esempio n. 8
0
        /// <summary>
        /// 更新任务状态
        /// </summary>
        /// <param name="task"></param>
        public void SaveTaskStatus(QuartzTask task)
        {
            if (task == null)
            {
                return;
            }

            var taskService = DIContainer.Resolve <IQuartzTaskService>();

            var t = taskService.FindById(task.Id);

            if (t != null)
            {
                t.LastStart       = task.LastStart;
                t.LastEnd         = task.LastEnd;
                t.NextStart       = task.NextStart;
                t.IsRunning       = task.IsRunning;
                t.LastIsSuccess   = task.LastIsSuccess;
                t.LastFailMessage = task.LastFailMessage;
                taskService.Update(t);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 更新任务
        /// </summary>
        /// <param name="task"></param>
        public void Update(QuartzTask task)
        {
            if (task == null)
            {
                return;
            }

            int index = _tasks.FindIndex(n => n.Id == task.Id);

            if (_tasks[index] == null)
            {
                return;
            }

            task.ClassType     = _tasks[index].ClassType;
            task.LastEnd       = _tasks[index].LastEnd;
            task.LastStart     = _tasks[index].LastStart;
            task.LastIsSuccess = _tasks[index].LastIsSuccess;

            _tasks[index] = task;

            Type type = Type.GetType(task.ClassType);

            if (type == null)
            {
                return;
            }

            Remove(type.Name);

            if (!task.Enabled)
            {
                return;
            }

            string triggerName = type.Name + "_trigger";

            IJobDetail job = JobBuilder.Create(typeof(JobDetail))
                             .WithIdentity(type.Name)
                             .Build();

            job.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));


            TriggerBuilder tb = TriggerBuilder.Create()
                                .WithIdentity(triggerName)
                                .WithCronSchedule(task.TaskRule);

            if (task.NextStart.HasValue)
            {
                tb.StartAt(new DateTimeOffset(task.NextStart.Value));
            }
            else if (task.StartDate > DateTime.MinValue)
            {
                tb.StartAt(new DateTimeOffset(task.StartDate));
            }

            if (task.EndDate.HasValue && task.EndDate > task.StartDate)
            {
                tb.EndAt(task.EndDate);
            }

            ICronTrigger trigger = (ICronTrigger)tb.Build();

            DateTime nextStart = sched.ScheduleJob(job, trigger).LocalDateTime;

            if (task.NextStart.HasValue && task.NextStart < nextStart)
            {
                task.NextStart = nextStart;
            }
        }
Esempio n. 10
0
 /// <summary>
 /// 删除任务
 /// </summary>
 /// <param name="task"></param>
 public void Delete(QuartzTask task)
 {
     _quartzTaskRepository.Delete(task);
 }
Esempio n. 11
0
 /// <summary>
 /// 更新任务
 /// </summary>
 /// <param name="task"></param>
 public void Update(QuartzTask task)
 {
     _quartzTaskRepository.Update(task);
 }
Esempio n. 12
0
 /// <summary>
 /// 创建任务
 /// </summary>
 /// <param name="task"></param>
 public void Create(QuartzTask task)
 {
     _quartzTaskRepository.Insert(task);
 }