>  기사  >  Java  >  Spring Boot에서 여러 예약된 작업을 구현하는 방법

Spring Boot에서 여러 예약된 작업을 구현하는 방법

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-15 16:50:341442검색

실제 개발에서는 일부 예약된 작업 시나리오를 어느 정도 사용하게 됩니다. 이 문서에서는 일반적으로 사용되는 예약된 작업에 대해 설명합니다.

일반적으로 사용되는 예약된 작업 구현 솔루션은 다음과 같습니다.

  • 타이머: 이것은 자바의 자동입니다 java.util.Timer 클래스를 사용하면 이 클래스를 사용하여 java.util.TimerTask작업. 이 방법을 사용하면 프로그램이 특정 빈도로 실행될 수 있지만 지정된 시간에는 실행되지 않습니다. 일반적으로 덜 사용됩니다. Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
  • ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
  • Spring TaskSpring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
  • Quartz
  • ScheduledExecutorService: 이후에도 jdk 제공되는 클래스는 스레드 풀 설계를 기반으로 하는 예약된 작업 클래스입니다. 예약된 각 작업은 실행을 위해 스레드 풀의 스레드에 할당됩니다.
  • Spring TaskSpring 3.0에 포함된 작업은 다음과 같습니다. 가벼운 Quartz로 간주되며 Quartz보다 사용이 훨씬 간단합니다.
    석영: 이것은 상대적으로 강력한 스케줄러를 사용하면 프로그램이 지정된 시간이나 특정 빈도로 실행될 수 있지만 구성이 약간 복잡합니다.
  • 데이터베이스에서 테이블을 생성하고 테이블에 cron 표현식을 저장합니다.

nacos는 분산 구성을 사용하여 동적 구성 cron 표현식을 구현합니다.

XXL-JOB, 분산 고정 작업

🎜🎜🎜Using Timer🎜🎜 🎜🎜🎜이것은 현재 프로젝트에서 덜 사용되며 데모 코드가 직접 게시됩니다. 🎜🎜자세한 소개를 보려면 API를 확인하세요: 🎜
public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次
        timer.schedule(timerTask,10,3000);
    }
}

Use ScheduledExecutorService

이 방법은 Timer와 유사합니다. 데모를 살펴보세요.

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 参数:1、任务体 2、首次执行的延时时间
        //      3、任务执行间隔 4、间隔时间单位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

Spring 작업 사용

간단한 예약 작업

Spring Boot 프로젝트에서 이를 사용할 수 있습니다. 예약된 작업을 구현하기 위한 매우 우아한 주석, 먼저 프로젝트 생성, 종속성 가져오기:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

작업 클래스 생성:

@Slf4j
@Component
public class ScheduledService {
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        log.info("=====>>>>>使用cron  {}",System.currentTimeMillis());
    }
    @Scheduled(fixedRate = 5000)
    public void scheduled1() {
        log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
    }
    @Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
    }
}

메인 클래스에서 @EnableScheduling 주석을 사용하여 예약된 작업에 대한 지원을 활성화한 다음 프로젝트 시작

Spring Boot에서 여러 예약된 작업을 구현하는 방법

3개의 예약된 작업이 모두 실행되었으며, 동일한 스레드에서 순차적으로 실행되는 것을 볼 수 있습니다. 예약된 작업이 하나만 있는 경우에는 예약된 작업 수가 늘어나도 문제가 되지 않습니다. 멈춰 있으면 다른 작업을 실행할 수 없습니다.

멀티 스레드 실행

기존 Spring 프로젝트에서는 xml 구성 파일에 작업 구성을 추가할 수 있습니다. Spring Boot 프로젝트에서는 일반적으로 구성을 추가하기 위해 config 구성 클래스를 사용하므로 새로운 AsyncConfig 클래스 AsyncConfig

@Configuration
@EnableAsync
public class AsyncConfig {
     /*
    此处成员变量应该使用@Value从配置中读取
     */
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}

@Configuration:表明该类是一个配置类@EnableAsync:开启异步事件的支持

然后在定时任务的类或者方法上添加@Async

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

@Configuration: 클래스가 구성 클래스임을 나타냅니다.@EnableAsync: 비동기 이벤트에 대한 지원을 켭니다

Spring Boot에서 여러 예약된 작업을 구현하는 방법그런 다음 클래스 또는 메서드에서 예약된 작업에 @Async . 마지막으로 프로젝트를 다시 시작하면 각 작업이 다른 스레드에 있습니다.

실행 시간 구성🎜🎜위의 예약된 작업에서는 메서드의 @Scheduled 주석을 사용하여 작업의 실행 시간을 설정하고 세 가지 속성 구성 방법을 사용합니다. 🎜
  1. fixedRate: 특정 빈도로 실행되는 예약된 작업을 정의합니다.
  2. fixedDelay: 특정 빈도로 실행되는 예약된 작업을 정의합니다. 위와 차이점은 속성 변경이 initialDelay와 협력할 수 있다는 것입니다. 작업의 지연된 실행 시간을 정의합니다.
  3. cron: 표현식을 통해 작업 실행 시간 구성

cron 표현식에 대한 자세한 설명

cron 표현식에는 공백으로 구분된 최소 6개(아마도 7개)의 시간 요소가 있습니다. 순서:

  • 초(0~59)
  • 분(0~59)
  • 3시간(0~23)
  • 4일(0~31)
  • 5 개월(0~11)
  • 6주(1~7 1=일 또는 일, 월, 화, 수, 목, 금, 토)
  • 연도(1970-2099)

각 요소 값(예: 6), 연속 간격(9-12), 간격(8-18/4)(/는 4시간마다를 의미), 목록(1, 3, 5), 와일드카드가 될 수 있습니다. "날짜"와 "요일"이라는 두 요소는 상호 배타적이므로 둘 중 하나를 설정해야 합니다. 구성 예:

  • 5초마다 실행: */5* * ?
  • 1분마다 실행: 0 /1 ?
  • 0 0 10,14,16 ?
  • 0 0/30 9-17 ? 9~5시 근무 중 30분마다
  • 0 0 12 ? *WED는 매주 수요일 정오 12시를 의미합니다
  • " 0 0 12 ?" at 12 noon
  • "0 15 10 ? "매일 오전 10시 15분에 트리거
  • "0 15 10 ?" 매일 오전 10시 15분에 트리거
  • "0 15 10 ? *" 매일 오전 10시 15분에 트리거됨
  • " 0 15 10 ? 2005" 매일 오전 10시 15분에 트리거됨 2005
  • " 0 14 * ?" 59
  • "0 0/5 14 ?" 매일 오후 2시부터 2시 55분까지 5분마다 트리거됨
  • "0 0/5 14,18 ?" ~ 오후 2시 55분 및 오후 6시부터 오후 6시 55분까지 5분마다
  • "0 0-5 14 ?" 매일 오후 2시부터 오후 2시 55분까지 1분마다 트리거됨 트리거
  • "0 10,44 14 ? 3 WED" 3월 매주 수요일 오후 2시 10분과 오후 2시 44분에 트리거됩니다.
  • "0 15 10 ? * MON-FRI" 월요일~금요일 오전 10시 15분
  • "0 15 10 15 * ?" 매월 15일 오전 10시 15분에 트리거
  • "0 15 10 L * ?" 매월 마지막 날 오전 10시 15분에 트리거
  • "0 15 10 * 6L" 트리거 매월 마지막 금요일 오전 10시 15분
  • "0 15 10 ? * 6L 2002-2005" 2002년부터 2005년까지 매월 마지막 금요일 오전 10시에 트리거됨 :15 트리거
  • " 0 15 10 ? * 6#3" 매월 세 번째 금요일 오전 10시 15분에 트리거됩니다.

일부 하위 표현식에는 일부 범위나 목록이 포함될 수 있습니다. 예: 하위 표현식 공식(일(주))은 다음과 같습니다. be "MON-FRI", "MON, WED, FRI", "MON-WED, SAT"

"*" 문자는 가능한 모든 값을 나타냅니다. "/" 문자는 값의 증분을 지정하는 데 사용됩니다

예: 하위 표현식(분)의 "0/15"는 0분부터 시작하여 15분마다를 의미합니다. 하위 표현식(분)의 "3/20"은 3분부터 시작하여 20분마다를 의미합니다. ("3, 23, 43"과 같은 의미입니다.)

"?" 문자는 날짜에만 사용됩니다. 지정된 값이 없음을 나타내는 두 개의 하위 표현식(월) 및 일(주) 두 하위 표현식 중 하나에 값이 할당되면 충돌을 피하기 위해 다른 하위 표현식의 값을 "?"로 설정해야 합니다.

"L" 문자는 일(월)에만 사용됩니다. 및 day (week) ) "last"라는 단어의 약어인 두 개의 하위 표현 "L" 앞에 특정한 것이 있으면 다른 의미를 갖습니다.

예: "6L"은 이번 달의 마지막 날부터 6일까지를 의미합니다. 참고: "L" 매개변수를 사용할 때 목록이나 범위를 지정하지 마세요. 이렇게 하면 문제가 발생할 수 있습니다.

W 문자는 평일(월~금)을 나타내며 요일 도메인에서만 사용할 수 있습니다. 지정한 요일에 가장 가까운 요일을 지정하는데 사용됩니다. 대부분의 비즈니스 처리는 근무 주를 기준으로 하므로 W 문자가 매우 중요할 수 있습니다.

예를 들어 일 필드의 15W는 "매월 15일에 가장 가까운 평일"을 의미합니다. 15일이 토요일인 경우 목요일이 14일(금요일)에 더 가깝기 때문에 트리거가 트리거됩니다. 월요일보다 15일이 휴무입니다.

C: "캘린더"를 의미합니다. 일정과 관련된 날짜를 의미하며, 해당 날짜가 연결되지 않은 경우 달력의 모든 날짜를 의미합니다.

예를 들어 날짜 필드의 5C는 달력에서 5일 다음 첫째 날에 해당합니다. 요일 필드의 1C는 일요일 이후 첫 번째 날에 해당합니다.

, - * /, - * ? / LC #, - * /
필드 허용되는 값 특수문자 허용
0~59 , - * /
0 ~59 , - * +
week 1~7 또는 SUN~SAT
연도(선택) 비워두기, 1970~2099

在线cron表达式生成:http://qqe2.com/cron/index

整合Quartz

  • 添加依赖

如果Spring Boot版本是2.0.0以后的,则在spring-boot-starter中已经包含了quart的依赖,则可以直接使用spring-boot-starter-quartz依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

如果是1.5.9则要使用以下添加依赖:

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
</dependency>

这里我使用Spring Boot版本是2.0.0.BUILD-SNAPSHOT ,该版本开始集成了Quartz,所以事实现起来很方便。其它好像比较麻烦,这里就不介绍,以后有时间再详细深入了解Quartz。

  • 创建任务类TestQuartz,该类主要是继承了QuartzJobBean
public class TestQuartz extends QuartzJobBean {
    /**
     * 执行定时任务
     * @param jobExecutionContext
     * @throws JobExecutionException
     */
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("quartz task "+new Date());
    }
}
  • 创建配置类QuartzConfig
@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail teatQuartzDetail(){
        return JobBuilder.newJob(TestQuartz.class).withIdentity("testQuartz").storeDurably().build();
    }

    @Bean
    public Trigger testQuartzTrigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)  //设置时间周期单位秒
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(teatQuartzDetail())
                .withIdentity("testQuartz")
                .withSchedule(scheduleBuilder)
                .build();
    }
}
  • 启动项目

Spring Boot에서 여러 예약된 작업을 구현하는 방법

最后

上面都是简单的介绍了关于Spring Boot定时任务的处理,直接使用SpringTask注解的方式应该是最方便的,而使用Quartz从2.0开始也变得很方便。对于这两种方式,应该说各有长处吧,按需选择。

위 내용은 Spring Boot에서 여러 예약된 작업을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제