以前一直用的是spring中的@Scheduled标签来做定时任务的管理,这样做的特别简单,但是无法灵活的运用在项目维护上,所以想到能不能用其他技术来实现动态管理定时任务的功能,搜索了一下资料,大部分都是关于quartz的设计实现,于是开始学习关于quartz的相关知识。
首先是quartz的基础运用部分,很简单,导几个jar包,然后spring配置文件中配置一下就可以了。(注意quartz的版本,不同的quartz版本差距还是蛮大的)
maven引入jar包:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
Spring配置信息:
定时执行的类以及方法:
<bean id="SpringTask" class="com.zkzy.task.SpringTask"/>
<bean id="task1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="SpringTask"/>
</property>
<property name="targetMethod"> <!--要执行的方法名称-->
<value>method1</value>
</property>
</bean>
调度触发器:(cronExpression中的值是自己定义存储在properties文件中的,实际上是一个cronExperssion表达式,可以自行百度具体含义)
<bean id="CronTriggerBean_1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="task1"></property>
<property name="cronExpression" value="#{configProperties['veStateflush']}"></property>
</bean>
调度工厂 :
<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="CronTriggerBean_1"/>
</list>
</property>
</bean>
这样应该就可以顺利执行了(后续做过持久化处理,原来的代码应该是这样的,可以参考看看);
上面就是quartz的初步实现了,我初步这样写的原因是想将spring定时任务的间隔可以放到配置文件中,这样就不用每次改动都要重新编译了,但是依旧无法满足后续更灵活的需求,因为每次改动都需要重新启动服务器,后续将继续进行quartz的持久化相关处理。