在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="" /> --> <!-- 系統(tǒng)會(huì)在啟動(dòng)時(shí)加載 --> <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詳細(xì)描述具體的任務(wù)運(yùn)行代碼實(shí)現(xiàn)
1.新增一個(gè)任務(wù)到scheduler
1 | JobDetail job = new JobDetail(taskName, Scheduler.DEFAULT_GROUP,DefaultQuartzJob.class); JobDataMap jobDataMap = job.getJobDataMap(); //根據(jù)PUT不同的TASK而運(yùn)行不同的任務(wù) 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(); ? // 將觸發(fā)任務(wù)的Trigger中所有的參數(shù)添加到上下文中 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{// 為任務(wù)時(shí)間執(zhí)行次數(shù)加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{//根據(jù)實(shí)例化不同的TASK而運(yùn)行不同的任務(wù) entryTask.process(taskContext); }catch (TaskException e) { logger.error( "catch exception while process task " + task.getName(), e); }}} |
==>TASK接口,繼承它可以實(shí)現(xiàn)不同的任務(wù)實(shí)現(xiàn)
1 | /** * 定時(shí)任務(wù)的基本接口 */publicinterface Task { ? /** * 任務(wù)執(zhí)行 * * @param request * 請(qǐng)求參數(shù) * @param response * 返回參數(shù) * @param cxt * @roseuid 4535938002AC */publicvoid process(TaskContext cxt) throws TaskException; ? /** * 任務(wù)名稱 * * @return java.lang.String * @roseuid 453DB0AB01B5 */public String getName(); } |
2.從scheduler中刪除一個(gè)任務(wù)
1 | scheduler.deleteJob(taskName, Scheduler.DEFAULT_GROUP); |
二.Trigger定時(shí)器,任務(wù)與定時(shí)器是一對(duì)多的關(guān)系
1.新建Trigger,初步分為CRONTRIGGER,SIMPLETRIGGER
1 | if (TRIGGER_CRON.equals(triggerType)) {//創(chuàng)建CRONTRIGGER trigger = new CronTrigger(triggerName, Scheduler.DEFAULT_GROUP, taskName, Scheduler.DEFAULT_GROUP, validStartTime, validEndTime, triggerPattern); trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING); }else{//創(chuàng)建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); |