/// <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);//任务完成,等待下一次执行 } }
private void RemoveScheduleJob(ScheduleJobsInfo job) { IJobDetail jobDetail = CreateJobDetail(job); if (sched.CheckExists(jobDetail.Key)) { sched.DeleteJob(jobDetail.Key); } }
/// <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); }
/// <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); }
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>"]); }; }
/// <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); }
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); } }
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); }
/// <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); }
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); }
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; }
public ScheduleJobSaveSuccessedEvent(ScheduleJobsInfo jobsInfo) { this.JobsInfo = jobsInfo; }