applicationContext.xml配置:每五秒轮询一次。注意:周和日期不能同时为通配符”*“
1 <bean id="planInfoServiceImpl" class="com.xxx.xxx"></bean> 2 <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 3 <property name="targetObject" ref="planInfoServiceImpl"></property> 4 <property name="targetMethod" value="backup"></property> 5 </bean> 6 <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 7 <property name="jobDetail" ref="jobDetail"></property> 8 <property name="cronExpression" value="*/5 * * * * ? *"></property> 9 </bean>
业务逻辑从spring容器中拿到任务和触发器:
1 @Autowired 2 private JobDetail jobDetail; 3 @Autowired 4 private CronTrigger trigger;
业务逻辑创建管理:使用此方法不会采用shutdown销毁Scheduler,因为销毁Scheduler后再次加载jobDetail时会报身份标识存在的异常,索性任务调度使用完毕后使用pauseAll()暂停任务调度,需要时恢复调度,按需修改触发周期。
1 SchedulerFactory ss = new StdSchedulerFactory(); 2 try { 3 if(sched==null){//第一次使用加载任务和触发器 4 sched = ss.getScheduler(); 5 sched.scheduleJob(jobDetail, trigger); 6 }else{//非第一次触发,恢复任务调度 7 try { 8 trigger.setCronExpression("*/5 * * * * ? *"); 9 } catch (ParseException e) { 10 e.printStackTrace(); 11 } 12 sched.resumeAll(); 13 } 14 if(!sched.isShutdown()){ 15 16 sched.start(); 17 } 18 } catch (SchedulerException e) { 19 e.printStackTrace(); 20 }
注意事项:JobDetail可以携带参数,但是就笔者使用的1.8.6版本来说,参数必须在装配jobdetail和scheduler时指定,在使用过程中添加携带参数是无效的。