【转】CommandLineRunner与定时任务

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的基本使用:启动加载数据

猜你喜欢

转载自blog.csdn.net/mao_mao37/article/details/129935454