Spring Boot中实现定时任务的主要方式

在Spring Boot中实现定时任务,主要有以下几种方式:

1. 使用@Scheduled注解

这是Spring Boot中最为简便的一种方式,只需在方法上添加@Scheduled注解,并指定任务的执行计划(如Cron表达式或固定延迟/间隔)。此外,还需要在Spring Boot的主类或配置类上添加@EnableScheduling注解来启用定时任务支持。

import com.fs.service.UserService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author: jpeng
 * @date: 2024/9/11 11:00
 * @description: Task定时任务
 */
@Component
public class MyTask {

    @Resource
    private UserService userService;

    //定义需要执行的任务,每隔多少时间执行一次
    @Scheduled(cron = "*/2 * * * * ?")
    public void taskone(){
        System.out.println("task info...");//例子
        //实际中我们可以调用service层的方法进行操作
    }
}

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@MapperScan("com.fs.mapper")
//开启task定时任务功能
@EnableScheduling
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }

}

2. 使用Quartz调度器

Quartz是一个功能丰富的开源作业调度库,它提供了比Spring的@Scheduled注解更为复杂的调度选项,如作业持久化、集群支持和事务性作业。

在Spring Boot中集成Quartz,你需要添加Quartz的依赖,并配置JobDetail、Trigger和Scheduler bean。

<!-- 在pom.xml中添加Quartz依赖 -->  
<dependency>  
    <groupId>org.quartz-scheduler</groupId>  
    <artifactId>quartz</artifactId>  
    <version>你的Quartz版本</version>  
</dependency>

然后,定义作业类、配置Quartz调度器,并通过Java配置或XML配置来注册JobDetail和Trigger。

使用Quartz调度器(更好的做法)

更好的做法(定义作业类,只定义JobDetail和Trigger的Bean)
在这种的情况下,我们只是定义了JobDetail和Trigger的Bean,并且没有显式地创建和启动Scheduler,那么这通常是可以的,并且通常是更好的做法,特别是当我们使用Spring Boot的spring-boot-starter-quartz时。

spring-boot-starter-quartz会自动为您配置并启动Scheduler,它会查找您定义的JobDetail和Trigger的Bean,并将它们注册到Scheduler中。这样,您就不需要自己手动管理Scheduler的生命周期了。

<!--quartz定时任务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * @author: jpeng
 * @date: 2024/9/11 10:31
 * @description: spring管理job
 * 1、定义类继承QuartzJobBean
 * 2、重写executeInternal来实现定时任务功能
 * 3、通过配置类来执行job触发器和调度器管理
 */
public class MyQuarzJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("quartz task run...");
    }
}
import com.fs.job.MyQuarzJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: jpeng
 * @date: 2024/9/11 10:33
 * @description: Quartz配置类
 */
@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail detail(){
        //绑定具体的工具Job
        return JobBuilder.newJob(MyQuarzJob.class).storeDurably().build();
    }

    @Bean
    public Trigger jobTrigger(){
        //指定了调度的规则
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/2 * * * * ? *");
        //通过触发器绑定工作明细和指定触发器调度规则
        return TriggerBuilder.newTrigger()
                .forJob(detail())
                .withSchedule(cronScheduleBuilder)
                .build();
    }
}

3. 使用TaskExecutor和ScheduledExecutorService

虽然这两种方式并不直接等同于定时任务调度,但它们可以用于在Spring Boot应用中执行异步任务。TaskExecutor是Spring框架中用于执行异步任务的接口,而ScheduledExecutorService是Java并发包中提供的一个接口,用于在给定延迟后运行命令或者定期地执行命令。

@Autowired  
private TaskExecutor taskExecutor;  
  
public void executeAsyncTask() {  
    taskExecutor.execute(() -> {  
        // 执行异步任务  
    });  
}  
  
// 或者使用Java的ScheduledExecutorService  
@Bean  
public ScheduledExecutorService scheduledExecutorService() {  
    return Executors.newScheduledThreadPool(5);  
}  
  
@Autowired  
private ScheduledExecutorService executorService;  
  
public void scheduleTask() {  
    executorService.schedule(() -> {  
        // 执行定时任务  
    }, 1, TimeUnit.SECONDS);  
}

注意,这些方式通常用于执行异步任务,而不是严格的定时任务调度。对于定时任务调度,推荐使用@Scheduled注解或Quartz。

4.总结

在Spring Boot中,推荐使用@Scheduled注解来实现简单的定时任务调度需求,因为它配置简单且易于使用。对于需要更复杂调度功能的场景,可以考虑使用Quartz。而TaskExecutor和ScheduledExecutorService则更适合于执行异步任务

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值