1. 程式人生 > >基於Quartz.net的遠端任務管理系統 二

基於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

好了,至此我們的服務端已經寫完了。下面就開始管理端的事了。