목차
Use ScheduledExecutorService " >Use ScheduledExecutorService
Spring 작업 사용 " >Spring 작업 사용
간단한 예약 작업
멀티 스레드 실행
cron 표현식에 대한 자세한 설명
整合Quartz " >整合Quartz
Java java지도 시간 Spring Boot에서 여러 예약된 작업을 구현하는 방법

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

Aug 15, 2023 pm 04:50 PM
spring boot

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

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

  • 타이머: 이것은 자바의 자동입니다 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, - * +
week1~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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Spring Boot+MyBatis+Atomikos+MySQL(소스 코드 포함) Spring Boot+MyBatis+Atomikos+MySQL(소스 코드 포함) Aug 15, 2023 pm 04:12 PM

실제 프로젝트에서는 분산 트랜잭션을 피하려고 노력합니다. 그러나 때로는 일부 서비스 분할을 수행해야 하므로 분산 트랜잭션 문제가 발생할 수 있습니다. 동시에 면접 시 시장에서도 분산 거래에 대한 질문을 하게 되는데, 이 사례를 가지고 연습도 할 수 있고, 면접에서는 123에 대해서도 이야기를 나눌 수 있습니다.

Spring Boot를 통해 다국어 지원 및 국제 애플리케이션 달성 Spring Boot를 통해 다국어 지원 및 국제 애플리케이션 달성 Jun 23, 2023 am 09:09 AM

세계화가 발전함에 따라 점점 더 많은 웹사이트와 애플리케이션이 다국어 지원과 국제화 기능을 제공해야 합니다. 개발자에게 이러한 기능을 구현하는 것은 언어 번역, 날짜, 시간, 통화 형식 등 여러 측면을 고려해야 하기 때문에 쉬운 작업이 아닙니다. 그러나 SpringBoot 프레임워크를 사용하면 다국어 지원과 국제 애플리케이션을 쉽게 구현할 수 있습니다. 먼저 SpringBoot에서 제공하는 LocaleResolver 인터페이스를 이해해보자. 위치

Spring Boot를 사용하여 빅 데이터 처리 애플리케이션을 구축하는 방법 Spring Boot를 사용하여 빅 데이터 처리 애플리케이션을 구축하는 방법 Jun 23, 2023 am 09:07 AM

빅데이터 시대가 도래하면서 빅데이터의 가치를 이해하고 이를 비즈니스에 적용하는 기업이 점점 늘어나고 있습니다. 이에 따른 문제는 이러한 대규모 데이터 흐름을 처리하는 방법입니다. 이 경우 빅데이터 처리 애플리케이션은 모든 기업이 고려해야 할 사항이 되었습니다. 개발자에게는 SpringBoot를 사용하여 효율적인 빅데이터 처리 애플리케이션을 구축하는 방법도 매우 중요한 문제입니다. SpringBoot는 다음을 허용하는 매우 인기 있는 Java 프레임워크입니다.

Spring Boot를 사용하여 블록체인 애플리케이션과 스마트 계약을 구축하는 방법 Spring Boot를 사용하여 블록체인 애플리케이션과 스마트 계약을 구축하는 방법 Jun 22, 2023 am 09:33 AM

비트코인 등 디지털 화폐의 등장으로 블록체인 기술이 점차 화제가 되고 있습니다. 스마트 계약은 블록체인 기술의 중요한 부분으로 간주될 수 있습니다. 널리 사용되는 Java 백엔드 개발 프레임워크인 SpringBoot는 블록체인 애플리케이션과 스마트 계약을 구축하는 데에도 사용할 수 있습니다. 이 기사에서는 SpringBoot를 사용하여 블록체인 기술을 기반으로 애플리케이션과 스마트 계약을 구축하는 방법을 소개합니다. 1. SpringBoot와 블록체인 먼저, 블록체인과 관련된 몇 가지 기본 개념을 이해해야 합니다. 블록체인

Spring Boot와 MyBatis Plus를 기반으로 ORM 매핑 구현 Spring Boot와 MyBatis Plus를 기반으로 ORM 매핑 구현 Jun 22, 2023 pm 09:27 PM

Java 웹 애플리케이션 개발 과정에서 ORM(Object-RelationalMapping) 매핑 기술을 사용하여 데이터베이스의 관계형 데이터를 Java 객체로 매핑함으로써 개발자가 데이터에 접근하고 조작하는 것을 편리하게 만듭니다. 가장 널리 사용되는 Java 웹 개발 프레임워크 중 하나인 SpringBoot는 MyBatis를 통합하는 방법을 제공했으며, MyBatisPlus는 MyBatis를 기반으로 확장된 ORM 프레임워크입니다.

Spring Boot와 NoSQL 데이터베이스 통합 및 사용 Spring Boot와 NoSQL 데이터베이스 통합 및 사용 Jun 22, 2023 pm 10:34 PM

인터넷의 발달로 인해 빅데이터 분석과 실시간 정보처리는 기업의 중요한 요구사항이 되었습니다. 이러한 요구 사항을 충족하기 위해 기존 관계형 데이터베이스는 더 이상 비즈니스 및 기술 개발 요구 사항을 충족하지 않습니다. 대신 NoSQL 데이터베이스를 사용하는 것이 중요한 옵션이 되었습니다. 이 기사에서는 NoSQL 데이터베이스와 통합된 SpringBoot를 사용하여 최신 애플리케이션을 개발하고 배포하는 방법에 대해 설명합니다. NoSQL 데이터베이스란 무엇입니까? NoSQL은 SQL이 아닙니다.

Spring Boot 기반의 분산 데이터 캐싱 및 저장 시스템 Spring Boot 기반의 분산 데이터 캐싱 및 저장 시스템 Jun 22, 2023 am 09:48 AM

인터넷의 지속적인 발전과 대중화에 따라 데이터를 어떻게 효율적이고 안정적으로 처리하고 저장하는지에 대한 요구도 높아지고 있습니다. SpringBoot를 기반으로 한 분산 데이터 캐싱 및 저장 시스템은 최근 몇 년간 많은 주목을 받고 있는 솔루션입니다. 분산 데이터 캐싱 및 저장 시스템이란 무엇입니까? 분산 데이터 캐싱 및 저장 시스템은 여러 노드(서버)를 통해 데이터를 분산 저장하는 것을 말하며, 이는 데이터의 보안과 신뢰성을 향상시키고 데이터 처리도 향상시킬 수 있습니다.

Spring Boot와 Apache ServiceMix를 사용하여 ESB 시스템 구축 Spring Boot와 Apache ServiceMix를 사용하여 ESB 시스템 구축 Jun 22, 2023 pm 12:30 PM

현대 기업이 다양한 서로 다른 애플리케이션과 시스템에 점점 더 많이 의존함에 따라 엔터프라이즈 통합이 더욱 중요해지고 있습니다. ESB(Enterprise Service Bus)는 다양한 시스템과 애플리케이션을 함께 연결하여 공통 데이터 교환 및 메시지 라우팅 서비스를 제공하여 엔터프라이즈 수준 애플리케이션 통합을 달성하는 통합 아키텍처 모델입니다. SpringBoot와 ApacheServiceMix를 이용하면 ESB 시스템을 쉽게 구축할 수 있다. 이 글에서는 이를 구현하는 방법을 소개한다. 스프링부트와 A

See all articles