定时任务在项目中经常应用,在每天、每月生成统计和报表等都需要,本文主要在spring boot和spring中应用定时任务。
Spring Boot定时任务
- 在Spring Boot启动类标注@EnableScheduling注解
package com.edu.yang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class YangApplication {
public static void main(String[] args) {
SpringApplication.run(YangApplication.class, args);
}
}
- 开发定时任务服务类
/**
* @auther: yangyongzhen
* @date: 2018/11/24 20:47
*/
@Service
public class ScheduleServiceImpl {
@Autowired
private TransactionService transactionService;
@Scheduled(cron = "0 5 0 * * ?")
@Async
public void scheduledJob() {
// 定时调用接口
transactionService.transaction();
}
}
使用@Async注解代表需要使用异步线程执行
@Scheduled配置项
配置项 描述 cron 使用表达式的方式定义任务执行时间 fixedDelay 从上一个任务完成到下一个任务开始的间隔(ms) initialDelay 在Spring IoC容器完成初始化后,首次任务执行延迟时间(ms) fixedRate 从上一个任务到下一个任务开始的间隔(ms) cron是一个6~7位时间元素(因为年是一个可以不配置的元素):
表达式:秒 分 时 天 月 星期 年
通配符 描述 * 任意值 ? 不指定值 - 指定时间区间 / 指定时间间隔执行 L 最后的 # 第几个 , 列举多个项 eg: 0 15 22 ? * 6#3 每月第三周周五的22:15触发(星期1~7 分别为: SUN,MON,TUE,WED,THU,FRI,SAT)
Spring Quartz定时任务
- 添加maven依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
- 要在spring 中利用quartz调度任务;需要配置三个bean:
① jobDetail 任务详细信息;包括调用哪个类;类中的哪个方法;执行时是否可并行执行任务。
<!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<bean id="dayTaskJob" class="com.edu.hart.framework.quartz.DayTaskJob"/>
<bean id="dayJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="group" value="job_work"/>
<property name="name" value="job_work_name"/>
<!--false表示等上一个任务执行完后再开启新的任务-->
<property name="concurrent" value="false"/>
<property name="targetObject" ref="dayTaskJob"/>
<property name="targetMethod" value="dayTask"/>
</bean>
② trigger 任务调度触发器;主要用于定义jobDetail什么时候执行。触发器最常用的有两种:简单触发器SimpleTrigger 和任务触发器CronTrigger 。
SimpleTrigger只能指定任务执行以什么样的频率执行,但无法制定精确的执行时间。
CronTrigger则既可以执行简单触发器所制定的以频率来执行的时间,也可以制定复杂的时间计划来执行。
<!-- simple调度触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- 设置任务详细信息 -->
<property name="jobDetail" ref="dayJobDetail"></property>
<!-- 设置任务延迟时间;延迟1秒执行 -->
<property name="startDelay" value="1000"></property>
<!-- 设置任务执行频率;每隔2秒执行一次 -->
<property name="repeatInterval" value="2000"></property>
</bean>
<!-- cron调度触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="name" value="work_default_name"/>
<property name="group" value="work_default"/>
<property name="jobDetail" ref="dayJobDetail"/>
<property name="cronExpression" value="0 5 0 */1 * ?"/>
</bean>
③ schedulerFactory 任务调度工厂;用于调度各个任务触发器。
<!-- 调度工厂 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean ="simpleTrigger"/>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>