찾다
Javajava지도 시간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 , - * +
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으로 문의하시기 바랍니다. 삭제
JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?Apr 23, 2025 am 12:14 AM

클래스 로더는 통합 클래스 파일 형식, 동적로드, 부모 위임 모델 및 플랫폼 독립적 인 바이트 코드를 통해 다른 플랫폼에서 Java 프로그램의 일관성과 호환성을 보장하고 플랫폼 독립성을 달성합니다.

Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Apr 23, 2025 am 12:09 AM

Java 컴파일러가 생성 한 코드는 플랫폼 독립적이지만 궁극적으로 실행되는 코드는 플랫폼 별입니다. 1. Java 소스 코드는 플랫폼 독립적 인 바이트 코드로 컴파일됩니다. 2. JVM은 바이트 코드를 특정 플랫폼의 기계 코드로 변환하여 크로스 플랫폼 작동을 보장하지만 성능이 다를 수 있습니다.

JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?Apr 23, 2025 am 12:07 AM

멀티 스레딩은 프로그램 대응 성과 리소스 활용을 향상시키고 복잡한 동시 작업을 처리 할 수 ​​있기 때문에 현대 프로그래밍에서 중요합니다. JVM은 스레드 매핑, 스케줄링 메커니즘 및 동기화 잠금 메커니즘을 통해 다양한 운영 체제에서 멀티 스레드의 일관성과 효율성을 보장합니다.

'플랫폼 독립성'은 Java의 맥락에서 무엇을 의미합니까?'플랫폼 독립성'은 Java의 맥락에서 무엇을 의미합니까?Apr 23, 2025 am 12:05 AM

Java의 플랫폼 독립성은 작성된 코드가 수정없이 JVM이 설치된 모든 플랫폼에서 실행될 수 있음을 의미합니다. 1) Java 소스 코드는 바이트 코드로 컴파일됩니다. 2) 바이트 코드는 JVM에 의해 해석되고 실행됩니다.

Java 응용 프로그램이 여전히 플랫폼 별 버그 또는 문제를 만날 수 있습니까?Java 응용 프로그램이 여전히 플랫폼 별 버그 또는 문제를 만날 수 있습니까?Apr 23, 2025 am 12:03 AM

javaapplicationscanindeedencounterplatform-specificissuesdespitetejvm'sabstraction.ressistinclude : 1) nativecodeandlibraries, 2) OperatingSystemDifferences, 3) jvmimplementationvariations, 및 4) 어려운 의존성, 개발자, 1)

클라우드 컴퓨팅은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?클라우드 컴퓨팅은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Apr 22, 2025 pm 07:05 PM

클라우드 컴퓨팅은 Java의 플랫폼 독립성을 크게 향상시킵니다. 1) Java Code는 바이트 코드로 컴파일되어 다른 운영 체제에서 JVM에 의해 실행되어 크로스 플랫폼 작동을 보장합니다. 2) Docker 및 Kubernetes를 사용하여 Java 응용 프로그램을 배포하여 휴대 성 및 확장 성을 향상시킵니다.

Java의 플랫폼 Independence는 광범위한 채택에서 어떤 역할을 했습니까?Java의 플랫폼 Independence는 광범위한 채택에서 어떤 역할을 했습니까?Apr 22, 2025 pm 06:53 PM

Java'SplatformIndencealLowsDeveloperstowStowRiteCodeOntOnitOniNanyDeviceOroswithajvm. ThisIsachieAdthroughCompilingTobyTecode, thejvMIngretSorcompileStruntime.thistureatureDificallyNatlyBoostedjava'SADOPTIONDUOCROSS-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PPLATION

Docker와 같은 컨테이너화 기술 (Docker)은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Docker와 같은 컨테이너화 기술 (Docker)은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Apr 22, 2025 pm 06:49 PM

Docker와 같은 컨테이너화 기술은 Java의 플랫폼 독립성을 대체하기보다는 향상됩니다. 1) 환경 간 일관성을 보장, 2) 특정 JVM 버전을 포함한 종속성 관리, 3) 배포 프로세스를 단순화하여 Java 응용 프로그램을보다 적응 가능하고 관리 할 수 ​​있도록합니다.

See all articles

핫 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 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.