Пример #1
0
        /// <summary>
        /// 插件任务执行完成相关操作
        /// </summary>
        private void OnPluginTaskCompleted(IJobExecutionContext context, ScheduleJobsInfo job, bool successed, string message)
        {
            if (job == null)
            {
                return;
            }
            jobsService.AddRunTimes(job.Id, successed);
            if (context != null)
            {
                if (job.Mode == JobMode.OnlyOnce || job.Mode == JobMode.OnceWhenServieStart)
                {
                    RemoveQuartzJob(context); //对于只执行一次的任务,完成即移除
                }
            }
            if (!successed)
            {
                logger.Error(message ?? "");  //记录错误日志
                if (job.Mode == JobMode.OnlyOnce || job.Mode == JobMode.OnceWhenServieStart)
                {
                    jobsService.UpdateStatus(job.Id, JobStatus.Failed);//任务完成
                }
                return;
            }

            if (job.Mode == JobMode.OnlyOnce || job.Mode == JobMode.OnceWhenServieStart)
            {
                jobsService.UpdateStatus(job.Id, JobStatus.Successed);
            }
            else
            {
                jobsService.UpdateStatus(job.Id, JobStatus.WaitToRun);//任务完成,等待下一次执行
            }
        }
Пример #2
0
        private void RemoveScheduleJob(ScheduleJobsInfo job)
        {
            IJobDetail jobDetail = CreateJobDetail(job);

            if (sched.CheckExists(jobDetail.Key))
            {
                sched.DeleteJob(jobDetail.Key);
            }
        }
Пример #3
0
        /// <summary>
        /// 创建任务详情
        /// </summary>
        /// <param name="job"></param>
        /// <returns></returns>
        private static IJobDetail CreateJobDetail(ScheduleJobsInfo job)
        {
            string     name      = "timer" + job.Id.ToString();
            string     group     = "timer" + job.ScheduleId.ToString();
            IJobDetail jobDetail = JobBuilder.Create <ScheduleTask>().WithIdentity(name, group).Build();

            jobDetail.JobDataMap["JOBS"] = job.Id;// new JobTaskArgument() { IsRunning = false, JobInfo=job } ;//.JSONSerialize();
            return(jobDetail);
        }
Пример #4
0
        /// <summary>
        /// 插件任务执行完成相关操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="result"></param>
        private void OnPluginTaskCompleted(IPlugins sender, ExecuteResult result)
        {
            if (sender == null)
            {
                logger.Error(new Exception("ExecuteCompletedHandler 事件未指定正确的sender参数"));  //记录错误日志
                return;
            }
            ScheduleJobsInfo job = jobsService.FindOne(sender.JobID);

            OnPluginTaskCompleted(null, job, result.Successed, result.Message);
        }
Пример #5
0
        public HomeModule(IScheduleJobsService jobsService)
        {
            this.RequiresAuthentication(); //需要身份验证

            Get["/"] = x =>
            {
                return(View["/Jobs/Index", jobsService.FindAll()]);
            };

            Get["/EditJob"] = x =>
            {
                return(View["/Jobs/AddJob"]);
            };

            Get["/EditJob/{id}"] = x =>
            {
                return(View["/Jobs/EditJob", jobsService.FindOne(x.id)]);
            };


            Post["/EditJob"] = x =>
            {
                JobModel jobModel = this.Bind <JobModel>();

                if (string.IsNullOrEmpty(jobModel.Name))
                {
                    return(View["/Shared/Error", "任务名不能为空,<a href=\"javascript:history.go(-1);\">重新添加</a>"]);
                }
                if (jobModel.PluginID <= 0)
                {
                    return(View["/Shared/Error", "请选择任务插件,<a href=\"javascript:history.go(-1);\">重新添加</a>"]);
                }
                ScheduleJobsInfo schJob = jobModel.ToScheduleJobsInfo();

                bool success = jobModel.Id == Guid.Empty? jobsService.AddJob(schJob):jobsService.UpdateJob(schJob);
                if (success)
                {
                    return(View["/shared/success", "保存成功,<a href=\"/\">返回列表</a>"]);
                }
                return(View["/Shared/Error", "保存失败,<a href=\"javascript:history.go(-1);\">重新添加</a>"]);
            };

            Get["/RemoveJob/{id}"] = x =>
            {
                bool successed = jobsService.Remove(x.id);

                if (successed)
                {
                    return(View["/shared/success", "删除成功,<a href=\"/\">返回</a>"]);
                }
                return(View["/Shared/Error", "删除失败,<a href=\"javascript:history.go(-1);\">返回</a>"]);
            };
        }
Пример #6
0
        /// <summary>
        /// 将任务加入计划队列
        /// </summary>
        /// <param name="job"></param>
        private void AddScheduleJob(ScheduleJobsInfo job)
        {
            IJobDetail jobDetail = CreateJobDetail(job);

            if (sched.CheckExists(jobDetail.Key))
            {
                sched.DeleteJob(jobDetail.Key);
            }

            ITrigger trigger = CeateTrigger(job, jobDetail.Key.Group);

            DateTimeOffset ft = sched.ScheduleJob(jobDetail, trigger);
        }
Пример #7
0
        public void Execute(IJobExecutionContext context)
        {
            Guid             jobID = (Guid)context.JobDetail.JobDataMap["JOBS"];
            ScheduleJobsInfo job   = jobsService.FindOne(jobID);

            if (job == null)
            {
                return;
            }
            logger.Info("Execute:" + job.ScheduleId.ToString());
            SchedulePluginsInfo schedule = pluginService.FindOne(job.ScheduleId);
            string assembly = schedule == null ? "" : schedule.AssemblyInfo;

            if (string.IsNullOrEmpty(assembly))
            {
                return;
            }
            IPlugins plugin = LoadPlugins.Instance.CreateInstance(assembly);

            if (plugin == null)
            {
                logger.Warn("实例化插件:" + assembly + "失败");
                //如果插件不存在,//标记未读取,以便下一次插件加载后可以读取任务
                jobsService.UpdateStatus(jobID, JobStatus.WaitToRun);
                RemoveQuartzJob(context);
                return;
            }
            jobsService.UpdateStatus(jobID, JobStatus.Running);//标记任务正在执行

            try
            {
                if (job.Mode == JobMode.OnTimeEveryTime)
                {
                    plugin.Execute(job.Id, schedule.NotifyUrl, job.Mode, null, OnPluginTaskCompleted);//执行任务
                }
                else
                {
                    TaskExecuteState state = new TaskExecuteState();
                    plugin.Execute(job.Id, schedule.NotifyUrl, job.Mode, state, null);//执行任务
                    state.Wait();
                    OnPluginTaskCompleted(context, job, plugin.State.Successed, plugin.State.OperationException != null ? plugin.State.OperationException.Message : "");
                }
            }
            catch (Exception ex)
            {
                jobsService.UpdateStatus(jobID, JobStatus.Failed);
                logger.Error(ex);
            }
        }
Пример #8
0
        public ScheduleJobsInfo ToScheduleJobsInfo()
        {
            ScheduleJobsInfo info = new ScheduleJobsInfo()
            {
                Id         = this.Id,
                Name       = this.Name,
                CreateTime = DateTime.Now,
                Mode       = (JobMode)(this.RunMode == 2 ? (this.RunMode + this.RunplanMode) : this.RunMode),
                RunPlan    = this.RunPlan,
                Status     = JobStatus.WaitToRun,
                ScheduleId = this.PluginID
            };

            return(info);
        }
Пример #9
0
        /// <summary>
        /// 创建任务触发器
        /// </summary>
        /// <param name="job"></param>
        /// <param name="group"></param>
        /// <returns></returns>
        private static ITrigger CeateTrigger(ScheduleJobsInfo job, string group)
        {
            string triggerName = "trigger_" + job.Id.ToString();

            TriggerBuilder triggerBuilder = TriggerBuilder.Create().WithIdentity(triggerName, "trigger_" + group);

            if (job.Mode == JobMode.OnlyOnce || job.Mode == JobMode.OnceWhenServieStart)
            {
                triggerBuilder = triggerBuilder.WithSimpleSchedule(x => x.WithRepeatCount(0)).StartNow();
            }
            else
            {
                triggerBuilder = triggerBuilder.WithCronSchedule(job.RunPlan);
            }
            ITrigger trigger = triggerBuilder.Build();

            return(trigger);
        }
Пример #10
0
        public bool AddJob(ScheduleJobsInfo job)
        {
            if (job == null)
            {
                return(false);
            }
            if (job.Id == Guid.Empty)
            {
                job.Id = Guid.NewGuid();
            }
            bool successed = repository.Save(job);

            if (successed)
            {
                DomainEvents.Raise <ScheduleJobSaveSuccessedEvent>(new ScheduleJobSaveSuccessedEvent(job));
            }
            return(successed);
        }
Пример #11
0
        public bool UpdateJob(ScheduleJobsInfo job)
        {
            ScheduleJobsInfo info = repository.FindOne(job.Id);

            if (info == null)
            {
                return(false);
            }
            info.Mode    = job.Mode;
            info.RunPlan = job.RunPlan;

            bool successed = repository.Save(info);

            if (successed)
            {
                DomainEvents.Raise <ScheduleJobSaveSuccessedEvent>(new ScheduleJobSaveSuccessedEvent(job));
            }
            return(successed);
        }
 public ScheduleJobRemovedEvent(ScheduleJobsInfo jobsInfo)
 {
     this.JobsInfo = jobsInfo;
 }
Пример #13
0
 public ScheduleJobSaveSuccessedEvent(ScheduleJobsInfo jobsInfo)
 {
     this.JobsInfo = jobsInfo;
 }