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   无状态

 quartz 1.7.2jar包及源码

 参考:Spring定时任务的几种实现方式 http://gong1208.iteye.com/blog/1773177

posted @ 2016-09-29 13:48  GoQC  阅读(692)  评论(0编辑  收藏  举报