在spring中通過org.springframework.scheduling.quartz.SchedulerFactoryBean來獲得Schedule類
1 | <bean id="quartzSchedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton"> <!-- set quartz scheduler factory configuration location --> <!-- <property name="configLocation" value="" /> --> <!-- 系統會在啟動時加載 --> <property name="autoStartup" value="true" /> </bean> <bean id="taskManage" class="com.sumit.task.TaskManage" scope="singleton"> <property name="taskDAO" ref="taskDao" /> <property name="scheduler" ref="quartzSchedulerFactory" /> </bean> |
QUARTZ中有Job與Trigger兩種概念
一.Job詳細描述具體的任務運行代碼實現
1.新增一個任務到scheduler
1 | JobDetail job = new JobDetail(taskName, Scheduler.DEFAULT_GROUP,DefaultQuartzJob.class); JobDataMap jobDataMap = job.getJobDataMap(); //根據PUT不同的TASK而運行不同的任務 jobDataMap.put("Task", task); job.setDurability(true); scheduler.addJob(job, true); |
==>DefaultQuartzJob
1 | publicclass DefaultQuartzJob implements Job { ? privatestatic Logger logger = Logger.getLogger(DefaultQuartzJob.class); ? publicvoid execute(JobExecutionContext ctx) throws JobExecutionException { JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap(); TaskTO task = (TaskTO) jobDataMap.get("Task"); ? Task entryTask = task.getEntryTask(); ? if (entryTask == null) { logger .error("Task " + task.getName() + " couldn't be initialized!"); return; } ? TaskContext taskContext = new DefaultTaskContext(); ? // 將觸發任務的Trigger中所有的參數添加到上下文中 JobDataMap triggerDataMap = ctx.getTrigger().getJobDataMap(); String[] keys = triggerDataMap.getKeys(); if (keys != null) {for (int i = 0; i < keys.length; i++) { Object obj = triggerDataMap.get(keys[i]); if (obj instanceof String[]) { String [] data=(String[]) obj; if(data.length>0){ taskContext.setParameter(keys[i], data[0]); }}elseif(obj instanceof String){ taskContext.setParameter(keys[i], (String)obj); }}}try{// 為任務時間執行次數加1 TaskManage tm = (TaskManage) triggerDataMap .get(TaskManage.TASKMANAGE_ATTRIBUTE_NAME); tm.addTriggerExecuteTimes(triggerDataMap .getString(TaskManage.TRIGGER_ATTRIBUTE_NAME)); }catch (TaskException e) { logger.error( "catch exception while process task " + task.getName(), e); }try{//根據實例化不同的TASK而運行不同的任務 entryTask.process(taskContext); }catch (TaskException e) { logger.error( "catch exception while process task " + task.getName(), e); }}} |
==>TASK接口,繼承它可以實現不同的任務實現
1 | /** * 定時任務的基本接口 */publicinterface Task { ? /** * 任務執行 * * @param request * 請求參數 * @param response * 返回參數 * @param cxt * @roseuid 4535938002AC */publicvoid process(TaskContext cxt) throws TaskException; ? /** * 任務名稱 * * @return java.lang.String * @roseuid 453DB0AB01B5 */public String getName(); } |
2.從scheduler中刪除一個任務
1 | scheduler.deleteJob(taskName, Scheduler.DEFAULT_GROUP); |
二.Trigger定時器,任務與定時器是一對多的關系
1.新建Trigger,初步分為CRONTRIGGER,SIMPLETRIGGER
1 | if (TRIGGER_CRON.equals(triggerType)) {//創建CRONTRIGGER trigger = new CronTrigger(triggerName, Scheduler.DEFAULT_GROUP, taskName, Scheduler.DEFAULT_GROUP, validStartTime, validEndTime, triggerPattern); trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING); }else{//創建SIMPLETRIGGER trigger = new SimpleTrigger(triggerName, Scheduler.DEFAULT_GROUP, taskName, Scheduler.DEFAULT_GROUP, validStartTime, validEndTime, repeatCount, repeatInterval); trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT); } ? try{//添加trigger到scheduler scheduler.scheduleJob(trigger); logger.debug("trigger " + trigger.getName() + " have been loaded to scheduler!"); }catch (SchedulerException e) { logger.error("Catch exception " + e.getMessage() + " while adding trigger " + triggerName + " into scheduler", e); thrownew TaskException("0096", "Catch exception " + e.getMessage() + " while adding trigger " + triggerName + " into scheduler", e); } ? |
2.刪除Trigger
1 | try{ scheduler.unscheduleJob(triggerName, Scheduler.DEFAULT_GROUP); }catch (SchedulerException e) { logger.error("Catch exception " + e.getMessage() + " while remove trigger " + triggerName + " from scheduler", e); thrownew TaskException("0096", "Catch exception " + e.getMessage() + " while removing trigger " + triggerName + " from scheduler", e); |