Spring之定时器(QuartzJobBean)的实现
需求:做个分配任务的功能模块,在任务截止前的十五分钟进行提醒(发送邮件、短信、系统提醒)。每隔五分钟提醒一次,直到任务完成!
想法:刚开始是想着是不是可以做个监听器,监听截止时间。当时间到了开始进行定时任务(尴尬,经验不足的臆测)。可不怎么好实现。。。。后来只能换个思路,
做个定时器,每五分钟执行一次,查出所有的任务截止时间,与当前时间比较,到十五分钟了进行提醒。。。。。听着好low啊,要不停的查询数据库。先只能暂时这样做着了。。
撸码:
1、pom文件:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
2、需要建个job的java类,继承 QuartzJobBean
public class MissionInformJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { getMissionInform(); } catch (Exception e) { logger.error("MissionInformJob ExecuteInternal MessagingException:" + e); } } public void getMissionInform (){} }
在方法里写要定时执行代码;
3、配置文件
1 <!-- 要调用的工作类 --> 2 <bean id="missionJob" class="com.ceair.bcc.message.job.MissionInformJob"></bean> 3 4 <!-- 任务配置列表 --> 5 <bean id="missionTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 6 <!-- 调用的类 --> 7 <property name="targetObject"> 8 <ref bean="missionJob" /> 9 </property> 10 <!-- 调用类中的方法 --> 11 <property name="targetMethod"> 12 <value>getMissionInform</value> 13 </property> 14 <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 --> 15 <property name="concurrent" value="true"/> 16 </bean> 17 18 <!-- 触发器配置 时间指定 --> 19 <bean id="missionCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 20 <property name="jobDetail" ref="messageTask"></property> 21 <!-- cron表达式 --> 22 <property name="cronExpression"> 23 <!-- 每隔5分钟执行一次--> 24 <!--<value>0/30 * * * * ?</value>--> 25 <value>0 0/5 * * * ?</value> 26 </property> 27 </bean> 28 29 30 <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> 31 <bean id="startQuertz" lazy-init="false" autowire="no" 32 class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 33 <property name="triggers"> 34 <list> 35 <!-- 触发器列表 --> 36 <!--<ref bean="msgCronTrigger" />--> 37 <!--<ref bean="emailCronTrigger" />--> 38 <ref bean="excessCronTrigger"/> 39 <ref bean="missionCronTrigger"/> 40 </list> 41 </property> 42 </bean>
虽然这样就写完了 但是还有很多疑问,,因为在网上也查了资料,很遗憾没有找到自己要的答案。
疑问:1、网上有的大神说 继承了QuartzJobBean类 就不需要再配置文件了,,,
2、org.springframework.scheduling.quartz.CronTriggerFactoryBean 和org.springframework.scheduling.quartz.SimpleTriggerBean的区别
https://blog.csdn.net/ye_sheng/article/details/48132393 这篇里写:
* 按任务调度的触发时机来分,主要有以下两种:
1.每隔指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.CronTriggerBean
注:这两种触发方式均可以跟两种作业继承方式相互组合来使用。
https://blog.csdn.net/defonds/article/details/49496895 这里写:
A:简单触发器,使用 SimpleTriggerFactoryBean
你可以定义作业的启动时间、触发器之间的延迟时间以及 repeatInterval(频率)。
1 <!-- Run the job every 2 seconds with initial delay of 1 second --> 2 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 3 <property name="jobDetail" ref="simpleJobDetail" /> 4 <property name="startDelay" value="1000" /> 5 <property name="repeatInterval" value="2000" />
B:计划触发器,使用 CronTriggerFactoryBean
这种类型更加灵活,允许你针对特定实例选择计划方案以及将来要执行的频率。
1 <!-- Run the job every 5 seconds --> 2 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 3 <property name="jobDetail" ref="firstComplexJobDetail" /> 4 <!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />--> 5 <property name="cronExpression" value="0/5 * * ? * *" />
做下记录,后期再进行深究和修正。。。