第五篇:SpringBoot定时任务、异步任务

本文介绍SpringBoot中定时任务和异步任务的使用方法,包括如何使用@EnableScheduling和@Scheduled注解实现定时任务,以及如何通过@EnableAsync和@Async注解实现异步任务,提高系统响应速度。

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

一、定时任务简介

程序中设置定时任务的作用就是定时的执行某一任务,比如

  • 管理系统定时向用户发送短信、邮件等
  • 互联网金融项目定期批款,放款等操作
  • 天气预报系统定期更新数据

二、Spring Boot定时任务的使用

Spring Boot定时任务与Quartz定时任务的区别

SpringBoot中使用定时任务非常简单使用@EnableScheduling、@Scheduled注解即可!

操作步骤如下:

1.创建一个SpringBoot Web应用

2.@EnableScheduling开启定时任务

@SpringBootApplication
@EnableScheduling //开启定时任务
public class SpringbootTaskApplication {

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

2.@Scheduled设置定时触发执行的时间

@Scheduled的属性

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {

	
	String cron() default "";

	String zone() default "";
        
        //@Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行
	long fixedDelay() default -1;

	String fixedDelayString() default "";

        //比如:@Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行
	long fixedRate() default -1; 

	String fixedRateString() default "";
      
	//@Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次
        long initialDelay() default -1;

	String initialDelayString() default "";

}

3.定时任务类必须注入spring容器,否则定时任务无效!

cron表达时的写法:

常用的cron表达式含义

每隔5秒执行一次:*/5 * * * * ? 
每隔1分钟执行一次:0 */1 * * * ? 
每天23点执行一次:0 0 23 * * ? 
每天凌晨1点执行一次:0 0 1 * * ? 
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ? 
每周星期天凌晨1点实行一次:0 0 1 ? * L 
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

在线cron表达式生成器 

@Service //必须向spring容器中注册,否则定时任务无效!
public class TaskService {
    //@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")//表示前4秒都执行一次
    //@Scheduled(cron = "0-4 * * * * MON-SAT")//表示前4秒都执行一次
    @Scheduled(cron = "0/4 * * * * MON-SAT") //表示每隔4秒执行一次
    public void test01(){
        System.out.println("=====定时执行一些业务=====");
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("hh:mm:ss");
        System.out.println("当前时间:"+simpleDateFormat.format(new Date()));
        System.out.println("01.定时向用户发送短信");
        System.out.println("02.定时删除缓存中的数据");
        System.out.println("03.定时数据库备份");
    }
    
    //每隔6秒执行一次
    @Scheduled(fixedRate = 6000)
    public void test02(){
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("hh:mm:ss");
        System.out.println("当前时间:"+simpleDateFormat.format(new Date()));
    }
}

三、Spring Boot异步任务的使用

异步任务的作用:减少程序运行时间、提升系统响应速度、快速响应用户!

SpringBoot异步处理使用场景

  • 发送短信
  • 发送邮件
  • APP消息推送
  • 节省运维凌晨发布任务时间提供效率

SpringBoot异步任务使用步骤如下:

1.使用注解@EnableAsync开启异步,会自动扫描

@EnableAsync //开启异步处理开关
@SpringBootApplication
public class SpringbootAsyncApplication {

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

2.定义@Component、@Async作为组件被容器扫描并且执行

@Component
public class AsyncTask {

    /**
     * 1.如果执行下面三个方法是同步任务耗时:1000+800+400
     * 2.开启异步任务执行下面三个方法耗时:取耗时最大的1000,
     *   也就是执行三个方法只需要1000
     */
    @Async
    public Future<Boolean> doTask01()throws Exception{
        long start=System.currentTimeMillis();
        //使用线程的目的测试方法执行时间
        Thread.sleep(1000);
        long end=System.currentTimeMillis();
        System.out.println("执行任务1耗时:"+(end - start)+"毫秒");
        return new AsyncResult<>(true);
    }
    @Async
    public Future<Boolean> doTask02()throws Exception{
        long start=System.currentTimeMillis();
        Thread.sleep(700);
        long end=System.currentTimeMillis();
        System.out.println("执行任务2耗时:"+(end - start)+"毫秒");
        return new AsyncResult<>(true);
    }
    @Async
    public Future<Boolean> doTask03()throws Exception{
        long start=System.currentTimeMillis();
        Thread.sleep(600);
        long end=System.currentTimeMillis();
        System.out.println("执行任务3耗时:"+(end - start)+"毫秒");
        return new AsyncResult<>(true);
    }
}

3.测试异步任务执行总时间

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootAsyncApplicationTests {
    @Autowired
    AsyncTask asyncTask;
    @Test
    public void test()throws Exception {
        long start=System.currentTimeMillis();
        Future<Boolean> f1=asyncTask.doTask01();
        Future<Boolean> f2=asyncTask.doTask02();
        Future<Boolean> f3=asyncTask.doTask03();

        //执行此段代码也需要耗时间
        while(!f1.isDone()||!f2.isDone()||!f3.isDone()) {
            if(f1.isDone() && f2.isDone() && f3.isDone())
                break;
        }
        long end=System.currentTimeMillis();
        System.out.println("执行以上三个任务总耗时:"+(end - start)+"毫秒");
    }

}

4.执行三个方法总耗时

执行任务3耗时:601毫秒
执行任务2耗时:701毫秒
执行任务1耗时:1000毫秒
执行以上三个任务总耗时:1028毫秒

5.如果注释@Async,那么就是同步任务。三个任务执行总耗时=600+700+1000(毫秒)

<think>首先,用户的问题是:“我想配置SpringBoot应用中的定时任务,使其每三小时执行一次。请问Spring Bootschedule taskevery3 hours”这是一个关于Spring Boot定时任务的问题,用户想要每三小时执行一次任务。 根据系统级指令:-所有行内数学表达式必须使用$...$格式,但这里没有数学表达式。-独立公式使用$$...$$,但这个问题不需要。- LaTeX语法正确:确保任何数学内容正确格式化。 -使用中文回答:整个响应必须用中文。-生成相关问题:在回答结束时,添加相关问题。-引用中引用的段落末尾添加引用标识:如[^1]。用户可见层指令: -回答结构清晰,逐步解决问题。-保证回答真实可靠。 参考提供的引用:-引用[1]:提到@EnableScheduling确保后台任务执行器创建。-引用[2]:关于Caffeine缓存的维护方法,但可能不直接相关。 -引用[3]:关于看门狗线程和锁续期,可能不直接相关。-引用[4]:关于Caffeine的时间轮调度,可能不直接相关。 这些引用中,引用[1]最相关,因为它直接涉及Spring定时任务。其他引用似乎与缓存或分布式锁相关,可能不是用户需求的焦点。用户的问题是关于定时任务的调度。关键点:-在SpringBoot中,使用@EnableScheduling启用定时任务支持。 -使用@Scheduled注解来定义任务执行频率。 -对于每三小时执行一次,可以使用cron表达式或固定延迟。每三小时执行一次的选项: 1. **cron表达式**:cron表达式可以表示每三小时。例如,`00*/3* **`表示每三小时执行一次(在每小时的第0分钟)。2.**固定延迟**:使用fixedRate或fixedDelay,但fixedRate可能更适合周期性任务。fixedRate表示从上一次开始后每三小时执行一次。在SpringBoot中,推荐使用cron表达式或fixedRate。 步骤: 1.在Spring Boot主类或配置类上添加@EnableScheduling。2.在任务方法上添加@Scheduled注解,并指定cron表达式或fixedRate。 例如: -使用cron: @Scheduled(cron= "00 */3 ** *") -使用fixedRate: @Scheduled(fixedRate =3*60 *60*1000) //3小时 inmilliseconds确保单位正确:3小时 =3*60 *60*1000毫秒。从引用[1]中:它提到@EnableScheduling是必要的,否则任务不会调度。所以,在回答中应该强调这一点。 结构回答:-先解释如何启用定时任务。-然后详细说明如何配置每三小时执行一次。 -提供代码示例。 -最后添加相关问题。相关问题生成: 基于主题,生成关于SpringBoot定时任务的深入问题。例如:1.如何配置定时任务在特定时间执行?2.如何处理定时任务的并发问题?3.定时任务的错误处理机制是什么?4.如何在分布式环境中使用SpringBoot定时任务?确保回答真实可靠:基于Spring Boot文档和常见实践。完整回答大纲: 1. **介绍启用定时任务**:引用@EnableScheduling。2.**配置每三小时执行**:解释两种方法(cron和fixedRate),推荐cron表达式。3.**代码示例**:提供一个简单的SpringBoot组件示例。4.**注意事项**:如确保任务执行时间短,避免阻塞等。 5. **相关问题**:列出几个相关问题。</think>### 配置Spring Boot定时任务每三小时执行一次 在Spring Boot中配置定时任务每三小时执行一次,可以通过`@EnableScheduling`启用定时任务支持,并使用`@Scheduled`注解定义执行频率。以下是逐步指南,确保配置正确可靠。核心方法是使用**cron表达式**或**fixedRate参数**,推荐cron表达式因其更灵活。 #### 步骤1: 启用定时任务支持 在Spring Boot主应用类或配置类上添加`@EnableScheduling`注解。这是必需的,否则定时任务不会生效。引用[1]提到:`@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled`[^1]。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // 启用定时任务支持 public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` #### 步骤2: 定义定时任务方法 在Spring管理的Bean(如`@Component`类)中,使用`@Scheduled`注解配置执行频率。以下是两种实现方式: - **推荐:使用cron表达式** cron表达式`0 0 */3 * * *`表示每三小时执行一次(在每小时的第0分钟触发)。 示例代码: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyScheduledTask { @Scheduled(cron = "0 0 */3 * * *") // 每三小时执行一次 public void executeEveryThreeHours() { // 你的任务逻辑,例如清理缓存、发送报告等 System.out.println("任务执行: " + new java.util.Date()); } } ``` - **替代:使用fixedRate参数** `fixedRate`指定任务开始时间的间隔(单位:毫秒)。3小时 = 3 × 60 × 60 × 1000 = 10,800,000毫秒。 示例代码: ```java @Scheduled(fixedRate = 10_800_000) // 每10,800,000毫秒(3小时)执行一次 public void executeEveryThreeHours() { // 任务逻辑 } ``` #### 关键注意事项 1. **cron vs fixedRate**: - cron表达式更精确(如`0 0 */3 * * *`在整点触发),适合固定时间点。 - fixedRate从上一次任务开始时计时,可能因任务执行时长而延迟,适合简单周期性任务。 2. **任务执行约束**: - 默认使用单线程执行任务。如果任务耗时较长,可能阻塞后续任务。引用[1]提到单线程问题[^1],可通过`@Async`或自定义线程池优化。 - 确保任务逻辑健壮:添加异常处理,避免任务失败影响调度。 3. **验证配置**: - 启动应用后,检查日志确认任务是否按时触发。 - 在开发环境使用`spring.scheduler.cron`属性动态覆盖表达式(例如在`application.properties`中设置`spring.scheduler.cron=0 0 */3 * * *`)。 #### 常见问题排查 - **任务执行**:检查是否遗漏`@EnableScheduling`或Bean未扫描。 - **分布式环境**:在集群中,定时任务可能在多个节点重复执行。引用[3]提到锁机制[^3],可使用Redis分布式锁(如Redisson)协调节点。 - **性能影响**:长时间任务可能占用资源,引用[2]和[4]涉及缓存维护机制[^2][^4],可借鉴异步处理优化。 通过以上步骤,你可以可靠地实现每三小时执行一次的定时任务。如需进一步优化,可参考Spring官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值