定时任务

本文介绍了在Spring Boot项目中如何使用定时任务,包括通过@EnableScheduling注解启用定时任务,使用@Scheduled注解配置cron表达式,以及Spring Quartz的集成,包括jobDetail、trigger和schedulerFactory的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时任务在项目中经常应用,在每天、每月生成统计和报表等都需要,本文主要在spring boot和spring中应用定时任务。

Spring Boot定时任务
  1. 在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);
    }

}
  1. 开发定时任务服务类
/**
 * @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定时任务
  1. 添加maven依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.3.0</version>
</dependency>
  1. 要在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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值