项目中有个功能需要加入定时(每天整点 30 分钟)执行一次任务的功能,听闻 quartz 的强大,可以设置复杂的调度任务,于是决定使用 quartz 环境 maven Spring 4.2.1 Release Tomcat 8.5 eclipse oxygen Ubuntu 16.04 引入依赖 org.quart ..

spring 整合 Quartz 定时任务以及填坑

本贴最后更新于 773 天前,其中的信息可能已经物是人非

项目中有个功能需要加入定时(每天整点 30 分钟)执行一次任务的功能,听闻 quartz 的强大,可以设置复杂的调度任务,于是决定使用 quartz

环境

引入依赖

<!-- 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)

回帖
请输入回帖内容...