靈活操做Java定時任務

宋現鋒 2018/2/6html

在開發測試平臺的時候,有不少狀況下須要用到定時任務,如接口或是服務的監控,頁面定時掃描,自動化測試用例定時執行等等。一般的作法是利用Jenkins作定時調用,也能夠藉助於Linux的定時任務crontab來設置要執行的任務。先前我使用python開發測試平臺的時候,就是直接操做/var/spool/cron/root進行定時任務的添加,刪除,開啓和暫停的。但是最近用java藉助於公司的SCF+WF框架進行測試平臺的開發的時候,發現存在着問題:前端

1,    直接經過命令行方式執行java文件比較麻煩,由於須要執行的文件要調用不少包。java

2,    而任何對定時任務的操做,如增長和刪除都是比較麻煩的,須要先編譯才能執行。python

因此直接執行java文件的方法行不通,因而去網上搜索java處理定時任務的方法。這一搜仍是挺多的,具體對考文章:http://www.javashuo.com/article/p-fdbhgovy-bs.html,爲了更加靈活地知足動態操做定時任務的須要,我決定使用Quartz。下面我將具體的使用詳細介紹一下:web

一,  添加maven依賴

    將下面的依賴添加到你的maven工程的pom.xml文件中:框架

<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> 

  

二,  編寫定時任務操做類

  下面的類中我添加了對定時任務操做的增,刪,改,開啓,中止等操做,代碼中的註釋比較全,很容易讀懂的。maven

package com.bj58.qa.comtestplatform.web.bll.Admonitorbll; import java.util.List; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; public class CronTabOperationsBll { private static SchedulerFactory schedulerFactory = new StdSchedulerFactory(); /** * @Description: 添加一個定時任務 * * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param jobClass 任務 * @param cron 時間設置,參考quartz說明文檔 * @param clid:定時任務ID */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron, String clid) { try { Scheduler sched = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); jobDetail.getJobDataMap().put("clid", clid); TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); triggerBuilder.withIdentity(triggerName, triggerGroupName); triggerBuilder.startNow(); triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); CronTrigger trigger = (CronTrigger)triggerBuilder.build(); sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 編輯一個定時任務 * * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param cron 時間設置,參考quartz說明文檔 * @param clid:定時任務ID */ public static void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron, String clid) { try { Scheduler sched = schedulerFactory.getScheduler(); JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName)); Class<? extends Job> jobClass = jobDetail.getJobClass(); removeJob(jobName, jobGroupName, triggerName, triggerGroupName); addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron, clid); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 刪除一個定時任務 * * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 */ public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { try { Scheduler sched = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); sched.pauseTrigger(triggerKey); sched.unscheduleJob(triggerKey); sched.deleteJob(JobKey.jobKey(jobName, jobGroupName)); } catch (Exception e) { throw new RuntimeException(e); } } /** * 啓動全部定時任務 */ public static void startJobs() { try { Scheduler sched = schedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** *關閉全部定時任務 */ public static void shutdownJobs() { try { Scheduler sched = schedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 關閉定時任務 * @param jobName 任務名 * @param jobGroupName 任務組名 */ public static void ShutDownJob(String jobName, String jobGroupName) { try { Scheduler scheduler = schedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); scheduler.pauseJob(jobKey); System.out.println("關閉定時任務:" + jobName); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 開啓一個定時任務 * @param jobName 任務名 * @param jobGroupName 任務組名 */ public static void StartJob(String jobName, String jobGroupName) { try { Scheduler scheduler = schedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); scheduler.resumeJob(jobKey); System.out.println("開啓定時任務:" + jobName); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 獲取定時任務中存在的任務 * @return */ public static String GetAllExcutingJobs() { String jobslist = "定時任務中存在的JobGroups:"; try { Scheduler scheduler = schedulerFactory.getScheduler(); List<String> jobgroups = scheduler.getJobGroupNames(); System.out.println("定時任務中存在的Jobs:" + jobgroups.size()); for (String jbgroup : jobgroups) { jobslist = jobslist + "JobGroup:" + jbgroup; } } catch (SchedulerException e) { e.printStackTrace(); } return jobslist; } /** * 獲取定時任務的狀態 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @return */ public static String GetJobStatus(String triggerName, String triggerGroupName) { String jobstatus = "定時任務" + triggerName + "的狀態是:"; try { Scheduler scheduler = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); Trigger.TriggerState state = scheduler.getTriggerState(triggerKey); jobstatus = jobstatus + state; } catch (SchedulerException e) { e.printStackTrace(); } return jobstatus; } public static void main(String[] args) { try { System.out.println("【系統啓動】開始(每1秒輸出一次)..."); addJob("測試定時任務", "測試分組", "測試觸發器", "測試觸發器分組", CronTabTask.class, "0/1 * * * * ?", "9527"); addJob("測試定時任務1", "測試分組1", "測試觸發器1", "測試觸發器分組1", CronTabTask.class, "0/2 * * * * ?", "850318"); System.out.println(GetJobStatus("測試觸發器", "測試觸發器分組")); Thread.sleep(5000L); ShutDownJob("測試定時任務1", "測試分組1"); System.out.println(GetJobStatus("測試觸發器1", "測試觸發器分組1")); } catch (Exception e) { e.printStackTrace(); } } } 

  

   將這個類添加到公用包中,在須要操做定時任務的地方進行靈活調用,便可完成你的需求。注意說明的一點是:個人定時任務比較複雜,須要藉助於」clid」來執行後續操做,因此在添加的時候須要傳參數來給定時任務。傳參數的語句以下:測試

jobDetail.getJobDataMap().put("clid", clid);ui

三,  定時任務執行類

   經過編寫下面的類來執行具體的定時任務:spa

package com.bj58.qa.comtestplatform.web.bll.Admonitorbll; import com.bj58.ershou.common.helper.LoggerHelper; import java.io.PrintStream; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class CronTabTask implements Job { private static LoggerHelper loggerHelper = new LoggerHelper(CronTabTask.class); /** * 執行監控任務的定時任務 */ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { String clid = jobExecutionContext.getJobDetail().getJobDataMap().getString("clid"); AdMonitorCronTab amct = new AdMonitorCronTab(); amct.AdMonitorTask(clid); System.out.println(new Date() + ": 執行廣告監控任務,任務ID:" + clid); } } 

  

而這個類中的AdMonitorCronTab纔是我具體須要監控的內容,經過調用AdMonitorTask(clid)來執行具體的操做。由於涉及具體的業務,就不在此粘貼代碼了。

四,  總結

    在具體的開發工做中,經過在網上查找相應的文章,加上本身的調試總結。充分證實上面代碼是的效可用的,藉助於前端用戶交互效果,能很好地完成對定時任務的靈活操做,在此將相關的內容總結一下,但願對有須要的同窗一點兒提示。

相關文章
相關標籤/搜索