quartz 新增工作調度

來源:互聯網
上載者:User

package com.lec.util.job;import java.text.ParseException;import java.util.Date;import java.util.HashMap;import org.quartz.CronTrigger;import org.quartz.Job;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.SimpleTrigger;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import com.lec.assurance.utils.StringHandler;/** * CronTrigger任務調度器 * @author lcy *Dec 1, 2011 */public class CronTriggerRunner {private static SchedulerFactory sf = new StdSchedulerFactory();/** * 根據任務名和工作群組名查詢一個任務 * @param jobName * @param jobGroupName * @return * @throws SchedulerException */public static JobDetail getJob(String jobName,String jobGroupName) throws SchedulerException{Scheduler sched = sf.getScheduler();JobDetail jobDetail=sched.getJobDetail(jobName, jobGroupName);if(jobDetail != null){return jobDetail;}return null;}   /*** 添加一個CronTrigger定時任務* @param jobName 任務名* @param jobGroupName 工作群組名* @param triggerName 觸發器名* @param triggerGroupName 觸發器組名* @param job     任務* @param time    時間設定,參考quartz說明文檔* @param params 傳遞參數* @throws SchedulerException* @throws ParseException */public static void addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,String time,HashMap<String,Object> params,Job jobClass) throws SchedulerException, ParseException{   Scheduler sched = sf.getScheduler();   JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass.getClass());//任務名,工作群組,任務執行類   if(params != null){  jobDetail.getJobDataMap().put("params",params);  }   //觸發器   CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);//觸發器名,觸發器組   trigger.setCronExpression(time);//觸發器時間設定   sched.scheduleJob(jobDetail,trigger);   if(!sched.isShutdown())       sched.start();}/** * 添加一個SimpleTrigger定時任務 * @param jobName 任務名 * @param jobGroupName 工作群組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param startTime 開始時間 * @param repeatInterval 間隔時間 * @param repeatCount 調用次數 * @param jobClass 任務 * @param params 傳遞參數 * @throws SchedulerException */public static void addJob(String  jobName,String  jobGroup,String  triggerName,String  triggerGroup,Date startTime,Integer repeatInterval,Integer repeatCount,Job jobClass,HashMap<String,Object> params) throws SchedulerException{JobDetail jobDetail = new JobDetail(jobName, jobGroup, jobClass.getClass());if(params != null){ jobDetail.getJobDataMap().put("params",params); }//觸發器SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName, triggerGroup);        //設定開始時間simpleTrigger.setStartTime(startTime);//設定間隔時間        simpleTrigger.setRepeatInterval(repeatInterval);        //設定調用次數        simpleTrigger.setRepeatCount(repeatCount);                Scheduler sched = sf.getScheduler();        sched.scheduleJob(jobDetail,simpleTrigger);     if(!sched.isShutdown())        sched.start();}   /** * 根據任務名和工作群組名修改任務的觸發時間* @param jobName 任務名* @param jobGroupName 工作群組名* @param time* @throws SchedulerException* @throws ParseException*/public static void modifyJobTime(String jobName,String jobGroupName,String time) throws SchedulerException, ParseException{    Scheduler sched = sf.getScheduler();    Trigger[] trigger = sched.getTriggersOfJob(jobName,jobGroupName);    if(trigger != null){    for(int i=0;i<trigger.length;i++){        ((CronTrigger)trigger[i]).setCronExpression(time);        sched.resumeTrigger(trigger[i].getName(),trigger[i].getGroup());    }    }}   /*** 根據觸發器名修改一個任務的觸發時間* @param triggerName觸發器名* @param triggerGroupName觸發器組名* @param time* @throws SchedulerException* @throws ParseException*/public static void modifyTriggerTime(String triggerName,String triggerGroupName,             String time)  throws SchedulerException, ParseException{    Scheduler sched = sf.getScheduler();    Trigger trigger = sched.getTrigger(triggerName,triggerGroupName);    if(trigger != null){        //修改時間        ((CronTrigger)trigger).setCronExpression(time);       //重啟觸發器       sched.resumeTrigger(triggerName,triggerGroupName);   }}/*** 移除任務* @param jobName任務名* @param jobGroupName工作群組名* @param triggerGroupName觸發器組名* @throws SchedulerException*/public static void removeJob(String jobName,String jobGroupName,String triggerGroupName) throws SchedulerException{  Scheduler sched = sf.getScheduler();  String[] triggerNames = sched.getTriggerNames(triggerGroupName);  if(triggerNames!=null){  for(int i=0;i<triggerNames.length;i++){  sched.pauseTrigger(triggerNames[i],triggerGroupName);//停止觸發器  sched.unscheduleJob(triggerNames[i],triggerGroupName);//移除觸發器   }  }  sched.deleteJob(jobName,jobGroupName);//刪除任務}   /*** 移除一個任務* @param jobName任務名* @param jobGroupName工作群組名* @param triggerName觸發器名* @param triggerGroupName觸發器組名* @throws SchedulerException*/public static void removeJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName) throws SchedulerException{  Scheduler sched = sf.getScheduler();  sched.pauseTrigger(triggerName,triggerGroupName);//停止觸發器  sched.unscheduleJob(triggerName,triggerGroupName);//移除觸發器  sched.deleteJob(jobName,jobGroupName);//刪除任務}/** * 停止一個任務 需要注意的是:這裡停止的job必須是實現InterruptableJob的 * @param jobName * @param jobGroupName * @throws SchedulerException */public static void stopJob(String jobName,String jobGroupName) throws SchedulerException {  Scheduler sched = sf.getScheduler();  sched.interrupt(jobName, jobGroupName);}/** * 計算時間運算式 * @param second        秒 * @param minute        分 * @param hour   時 * @param day日期 * @param month月份 * @param week星期 * @param year年份 * @param isContactYear 是否包括年份 * @return */public static String getCexpress(String second,String minute,String hour,String day,String month,String week,String year,boolean isContactYear) {String cexpress="";//秒,預設為"0" 取值範圍:0-59if(StringHandler.isValidStr(second)){cexpress+=Integer.parseInt(second)+" ";}else{cexpress+="0 ";}/** * 分 取值範圍:0-59 * 預設為"*"      表示每一分鐘 * 如果是0 12     表示整12:00觸發 * 如果是0/5 12   表示在每天下午12點到12:55期間的每5分鐘觸發 , * 如果是0-5 12   表示12:00到12:05期間的每1分鐘觸發 * 如果是10,15 12 表示12:10和12:15觸發 */if(StringHandler.isValidStr(minute)){cexpress+=minute+" ";}else{cexpress+="* ";}/** * 小時 取值範圍:0-23 * 預設為"*"      表示每一個小時 * 如果是0        表示淩晨觸發 * 如果是0-5 表示淩晨到5:00期間 * 如果是10,15    表示10:00和15:00觸發 */if(StringHandler.isValidStr(hour)){cexpress+=hour+" ";}else{cexpress+="* ";}/** * 日期 取值範圍:1-31 * 預設為"*" 表示每天 * 如果是15  表示每個月的15號 * 如果是L   表示每個月最後一天  * 註:在指定了星期的時候,把日期這裡設定為"?" */if(StringHandler.isValidStr(day)){cexpress+=day+" ";}else{cexpress+="* ";}/** * 月份 取值範圍:1-12 * 預設為"*"  表示每個月 * 如果是 12  表示12月份 */if(StringHandler.isValidStr(month)){cexpress+=month+" ";}else{cexpress+="* ";}/** * 星期  取值範圍:1-7 MON,TUE,WED,THU,FRI,SAT,SUN  其中1表示星期日,以此類推 * 預設為"?" * 如果是WED      表示每個星期三 * 如果是MON-FRI  表示星期一到星期五 * 如果是6L       表示每月最後一個星期五 * 如果是6#3      表示每月第三個星期五 */if(StringHandler.isValidStr(week)){cexpress+=week+" ";}else{cexpress+="? ";}//如果包括年份if(isContactYear){/** * 年份  取值範圍:1970-2099 * 預設值為空白 * 如果是2010 表示只有2010年觸發時間 * 如果是2010,2020 表示只有2010 */if(StringHandler.isValidStr(year)){cexpress+=year;}}return cexpress;}public static void main(String [] args){try {/*--------------------建立一個指定時間執行的job-----------------------*/JobDetail jobDetail = new JobDetail("fundsrecord_jobname_folkholdersId1", "fundsrecord_jobgroupname_folkholdersId1",FundsrecordJob.class);        // ①-1:建立CronTrigger,指定組及名稱        CronTrigger cronTrigger = new CronTrigger("fundsrecord_triggername_folkholdersId1","fundsrecord_triggergroupname_folkholdersId1");        // ①-2:定義Cron運算式        String timeexp = "";String second = "0";String minute = "15";String hour = "0";String day = "L";//當月的最後一天String month = "";String week = "?";month = "6,12";timeexp = getCexpress(second, minute, hour, day, month, week, null, false);        if(!"0 * * * * ?".equals(timeexp)){//如果沒有設定時間則不執行        CronExpression cexp = new CronExpression(timeexp);        // ①-3:設定Cron運算式        cronTrigger.setCronExpression(cexp);        Scheduler scheduler = sf.getScheduler();        scheduler.scheduleJob(jobDetail, cronTrigger);        scheduler.start();        }                    /*--------------------建立一個間隔一定時間執行的job-----------------------*/String jobName = "fundsrecord_jobname_folkholdersId2";String jobGroupName = "fundsrecord_jobgroupname_folkholdersId2";String triggerName = "fundsrecord_triggername_folkholdersId2";String triggerGroupName = "fundsrecord_triggergroupname_folkholdersId2";Date beginTime = new Date(System.currentTimeMillis() + 60000L);//目前時間過60秒鐘後開始Integer repeatInterval = 5000;//以毫秒為單位Integer repeatCount = 0;HashMap<String, Object> map = new HashMap<String,Object>();map.put("folkholdersId", "2");try {CronTriggerRunner.addJob(jobName,jobGroupName,triggerName,triggerGroupName,beginTime,repeatInterval,repeatCount,new FundsrecordJob(),map);} catch (SchedulerException e) {// TODO Auto-generated catch blocke.printStackTrace();}       } catch (Exception e) {           e.printStackTrace();       }}}

package com.lec.util.job;import java.util.HashMap;import org.quartz.InterruptableJob;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.SchedulerException;import org.quartz.UnableToInterruptJobException;/** * 任務調度器 * @author lcy *May 24, 2011 */public class FundsrecordJob implements InterruptableJob {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {JobDataMap map = context.getMergedJobDataMap();Object obj = map.get("params");if(obj != null ){HashMap<String,Object> params = (HashMap<String,Object>)obj;dojob();//在這個任務調度器裡面需要執行的方法Long folkholdersId = Long.parseLong((String)params.get("folkholdersId"));try {CronTriggerRunner.stopJob("fundsrecord_jobname_folkholdersId"+folkholdersId,"fundsrecord_jobgroupname_folkholdersId"+folkholdersId);//停止本次job} catch (SchedulerException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void interrupt() throws UnableToInterruptJobException {}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.