【转】CommandLineRunner与定时任务

文章介绍了Springboot中如何使用CommandLineRunner接口在项目启动时执行初始化任务,并详细阐述了@Scheduled注解的使用来设置定时任务,包括Cron表达式的应用和任务执行顺序的控制。

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

1. CommandLineRunner

在Spring boot项目的实际开发中,我们有时需要项目服务启动时加载一些数据或预先完成某些动作。Spring boot的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次。
使用方式:
与@Component注解配合使用
例如:

@Component
@Slf4j
@Order(1)
public class UserRunner implements CommandLineRunner {
    @Override
    public void run(String... args) {
        log.info("Start to loading user data");
        System.out.println("liudy23 测试启动加载初始数据--逻辑代码块");
        log.info("End CommandLineRunner......");
    }
}

UserRunner类实现了CommandLineRunner方法,并重写了Run方法,再run方法里面进行逻辑代码的书写。
注意一个项目里面可以有多个CommandLineRunner,执行的先后顺序可以由注解@Order(number)控制,number越小越早执行,即number值越小优先级越高。

 

2. 定时任务

2.1 相关注解

@EnableScheduling

@EnableScheduling 在配置类上使用,开启计划任务的支持(类上)
@EnableScheduling 开启定时任务 有该注解才能够跑定时任务
要在任务的类上@Component
要在任务方法上写@Scheduled

 @Scheduled

@Scheduled 来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)
要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测Scheduled注解,执行计划任务。

 2.2 定时任务执行

package com.example.practice.common.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author 刘德意
 * @date 2022/8/6
 */


@Slf4j
@Component
@EnableAsync
@EnableScheduling
public class UserScheduledTask {

    /*
        @Component 注解用于对那些比较中立的类进行注释
        相对与在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释

        @EnableScheduling 开启定时任务 有该注解才能够跑定时任务
        @Scheduled 添加定时任务  @Scheduled(cron = "0/2 * * * * ?") cron 表达式

        @EnableAsync 开启多线程

        @Async 在方法上使用该@Async注解,申明该方法是一个异步任务
        在类上面使用该@Async注解,申明该类中的所有方法都是异步任务;
        要想使用异步任务,需要在主类上开启异步配置,即,配置上@EnableAsync注解;
     */

    @Async
    @Scheduled(cron = "0/2 * * * * ?")
    public void scheduledTask01() {
        log.info("Start to scheduledTask");
        System.out.println("开启定时任务(0/2 * * * * ?)每两秒执行一次  " + "\r\n线程:" + Thread.currentThread().getName());
        log.info("end to scheduledTask");
    }

    @Async
    @Scheduled(cron = "0/4 * * * * ?")
    public void scheduledTask02() {
        log.info("Start to scheduledTask");
        System.out.println("开启定时任务02(0/4 * * * * ?)每四秒执行一次  " + "\r\n线程:" + Thread.currentThread().getName());
        log.info("end to scheduledTask");
    }
}

执行结果:

定时任务结果

2.3 在线Cron表达式生成器 

Cron表达式生成器及常用cron表达式例子

3. 参考文献

SpringBoot的 CommandLineRunner的使用
定时任务 @Scheduled注解的学习
Spring boot CommandLineRunner的基本使用:启动加载数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值