基于Quartz.net的远程任务管理系统 二

紧接着上一篇。上一篇讲了表设计与ADO.Net基本操作。接下来,就来说说怎么动态来添加Job任务及清理过期任务吧。

首先,先理一下思路,做事情要先把思绪理清了,然后下手就快准狠了。下面是我的思路:做一个定时任务去检查任务表(job_info)中的所有Job,如果在Schedule中不存在的,则添加进来;

已存在的,则根据当时Job的状态来决定是否继续保留Job存活在Schedule中。

好了,有上面这样一个思路做出来就方便了,先了解一下操作Schedule中的Job几个方法:

  • 添加:scheduler.ScheduleJob(job, trigger);
  • 暂停:scheduler.PauseJob(jobKey);
  • 删除:scheduler.DeleteJob(jobKey);

现在,在JobManage.Job中添加一个LoopJob Job任务,定期检查Schedule中的Job,其核心代码如下:

List<Job_Info> jobList = new JobInfoBLL().GetJobList();
                if (jobList != null && jobList.Count > 0)
                {
                    JobKey jobKey = null;
                    foreach (var jobinfo in jobList)
                    {
                        jobKey = new JobKey(jobinfo.Job_name + JobConfig.JOBKEY_NAMEEND, "group1");
                        //只有正常执行状态的Job才添加到调度器中
                        if (!JobConfig.scheduler.CheckExists(jobKey) && jobinfo.Job_state == 0)
                        {
                            IJobDetail job = JobBuilder.Create<RunTaskDLLJob>().WithIdentity(jobKey).Build();

                            //创建触发器
                            TriggerBuilder tb = TriggerBuilder.Create()
                            .WithIdentity(jobinfo.Job_name + JobConfig.JOBTRIGGER_NAMEEND, "group1");
                            if (!string.IsNullOrEmpty(jobinfo.Job_corn))
                                tb.WithCronSchedule(jobinfo.Job_corn);//执行corn表达式
                            if (jobinfo.Job_execount > 0)//如果执行固定的次数
                                tb.WithSimpleSchedule(a => a.WithRepeatCount(jobinfo.Job_execount));

                            if (jobinfo.Job_starttime != null && jobinfo.Job_starttime > DateTime.Now)//设置Job启动时间
                                tb.StartAt(jobinfo.Job_starttime);
                            else
                                tb.StartNow();

                            ITrigger trigger = tb.Build();
                            //传递参数
                            job.JobDataMap.Add(jobKey.Name, jobinfo.Id);

                            JobConfig.scheduler.ScheduleJob(job, trigger);

                            Log4NetHelper.Info(string.Format("加入Job:{0}成功", jobKey.Name), logger: logger);
                        }
                        else if (JobConfig.scheduler.CheckExists(jobKey))
                        {
                            if (jobinfo.Job_state == 2 || jobinfo.Job_state == 3)
                            {
                                JobConfig.scheduler.PauseJob(jobKey);
                                Log4NetHelper.Info(string.Format("暂停Job:{0}成功", jobKey.Name), logger: logger);
                            }
                            else if (jobinfo.Job_state == 4)
                            {
                                JobConfig.scheduler.DeleteJob(jobKey);
                                Log4NetHelper.Info(string.Format("删除Job:{0}成功", jobKey.Name), logger: logger);
                            }
                        }
                    }
                }
View Code

到这里,可以理整个项目就完成的,差不多了。但是往往只在Job_Log是不足以记录运行日记及调试日志的。所以我就加了一个日志项,JobManage.Log,里面可提供Log4Net日志及单纯文本日志,具体的请查看项目源码。

其实这个LoopJob可以使用定时器来代替的,我个人觉得既然使用了Quartz那就一起用了,这个凭个人喜好而定。好了,检查Job的任务有了,那接下来,就要执行Job了。到这里,我们定义在JobManage.Lib中的接口就发

挥它的作用了。再来添加一个Job,在Execute中,反射出实现了Lib中的接口的类,并调用方法完成Job的执行。如下:

Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + job.Job_assembly);
                object obj = assembly.CreateInstance(job.Job_class);

                Lib.IJob jobi = (Lib.IJob)obj;
               

                jobbll.UpdateJobState(new Job_Info() { Job_state = 1, Id = job.Id });

                var r = jobi.Exceute();
View Code

好了,至此我们的服务端已经写完了。下面就开始管理端的事了。

 

源码github:https://github.com/zshankang/JobManage

如果有其他的问题,可以加QQ群:1600800 

posted @ 2018-11-04 19:22  照月zshankang  阅读(350)  评论(0编辑  收藏  举报
交流询问请加QQ群:1600800