项目中有个功能需要加入定时(每天整点 30 分钟)执行一次任务的功能,听闻 quartz 的强大,可以设置复杂的调度任务,于是决定使用 quartz
环境
- maven
- spring 4.2.1 Release
- tomcat 8.5
- eclipse oxygen
- ubuntu 16.04
引入依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
这里有个坑,spring-context 中有个包叫 scheduling,但是并没有 qutzar 这个子包,所以需要单独引入 spring-context-support
配置 spring-bean
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 线程执行器配置,用于任务注册 -->
<bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="20" />
<property name="queueCapacity" value="500" />
</bean>
<!-- 业务对象 -->
<bean id="bizObject" class="xx.xx.xx.xx.job.Myjob" />
<!-- 调度业务 -->
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="bizObject" />
<!-- 设置执行的方法 -->
<property name="targetMethod" value="execute" />
</bean>
<!-- 增加调度触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 定义表达式 -->
<property name="cronExpression" value="0 0/30 * * * ?" />
</bean>
<!-- 设置调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>
</beans>
这里还有个问题,参考的文章中触发器使用的是 CronTrigger 类,需要使用 spring-content-support 1.x 版本
之后的版本使用的是 CronTriggerFactoryBean
这是任务类,直接写业务逻辑 E
public class Myjob{
//可注入service
//@AutoWired
// private Service service;
public void execute(){
//do something
}
}
表达式
表达式语法可以看参考中的连接,也可以直接使用生成器生成,参考文章末尾
参考
Spring 集成 Quartz 定时任务框架介绍和 Cron 表达式详解
生成器
cron.qqe2.com 在线生成
quartz 表达式在线自动生成
生成后底部有测试功能可以调试
(End)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于