quartz定时任务
本人此次在项目中使用了参考页面中提供的quartz(版本1.7.2)的第二种(作业类不继承特定基类),作业调度方式采用cronTriggerBean实现。
项目需要一个功能是,判断任务是否正在执行,若没有正在执行则立即执行该任务。
先上实现的关键代码:
配置文件:
1 <bean id="mI" 2 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 3 <property name="targetObject"> 4 <bean class="com.xxx.xxx.xxx.component.DetectTask" /> 5 </property> 6 <property name="targetMethod" value="doDetect" /> 7 <property name="concurrent" value="false" /><!-- 作业不并发调度 --> 8 </bean> 9 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 10 <property name="jobDetail" ref="mI" /> 11 <!--每5分钟运行一次 --> 12 <property name="cronExpression" value="* 0/5 * * * ?" /> 13 </bean> 14 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 15 <property name="triggers"> 16 <list> 17 <ref bean="cronTrigger" /> 18 </list> 19 </property> 20 </bean>
Java代码:
1 //注入相关bean 2 @Autowired 3 MethodInvokingJobDetailFactoryBean mI; 4 @Autowired 5 SchedulerFactoryBean scheduler; 6 @Autowired 7 CronTriggerBean cronTrigger; 8 ... 9 ... 10 //逻辑代码 11 Scheduler s = scheduler.getObject(); 12 try { 13 if(Trigger.STATE_BLOCKED == s.getTriggerState(cronTrigger.getName(), cronTrigger.getGroup())){ 14 commonResult.setMessage("定时任务正在执行,无需进行任何操作"); 15 }else { 16 JobDetail jobDetail = mI.getObject(); 17 try { 18 s.triggerJob(jobDetail.getName(), jobDetail.getGroup()); 19 commonResult.setMessage("执行探测任务~成功!"); 20 } catch (SchedulerException e) { 21 e.printStackTrace(); 22 commonResult.setMessage("失败!"+ e.getMessage()); 23 commonResult.setSuccess(false); 24 } 25 } 26 } catch (SchedulerException e) { 27 e.printStackTrace(); 28 }
采用Scheduler接口的getTriggerState方法获取任务执行状态、Scheduler.triggerJog(jobName, jobGroup)立即执行任务。
附:源码中各状态值及含义
Trigger.STATE_NORMAL 0 普通 Trigger.STATE_PAUSED 1 暂停 Trigger.STATE_COMPLETE 2 完成(那一刻) Trigger.STATE_ERROR 3 错误 Trigger.STATE_BLOCKED 4 正在执行 Trigger.STATE_NONE -1 无状态
参考:Spring定时任务的几种实现方式 http://gong1208.iteye.com/blog/1773177