실제 개발에서는 일부 예약된 작업 시나리오를 어느 정도 사용하게 됩니다. 이 문서에서는 일반적으로 사용되는 예약된 작업에 대해 설명합니다.
일반적으로 사용되는 예약된 작업 구현 솔루션은 다음과 같습니다.
java.util.TimerTask
작업. 이 방법을 사용하면 프로그램이 특정 빈도로 실행될 수 있지만 지정된 시간에는 실행되지 않습니다. 일반적으로 덜 사용됩니다. Timer
:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask
任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。ScheduledExecutorService
:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。Spring Task
:Spring3.0
以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。Quartz
ScheduledExecutorService
: 이후에도 jdk 제공되는 클래스는 스레드 풀 설계를 기반으로 하는 예약된 작업 클래스입니다. 예약된 각 작업은 실행을 위해 스레드 풀의 스레드에 할당됩니다.
Spring Task
:Spring 3.0에 포함된 작업
은 다음과 같습니다. 가벼운 Quartz로 간주되며 Quartz보다 사용이 훨씬 간단합니다. 석영
: 이것은 상대적으로 강력한 스케줄러를 사용하면 프로그램이 지정된 시간이나 특정 빈도로 실행될 수 있지만 구성이 약간 복잡합니다. 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); } }
이 방법은 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 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 주석을 사용하여 예약된 작업에 대한 지원을 활성화한 다음 프로젝트 시작
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
: 비동기 이벤트에 대한 지원을 켭니다그런 다음 클래스 또는 메서드에서 예약된 작업에 @Async
. 마지막으로 프로젝트를 다시 시작하면 각 작업이 다른 스레드에 있습니다.
initialDelay
와 협력할 수 있다는 것입니다. 작업의 지연된 실행 시간을 정의합니다. cron 표현식에는 공백으로 구분된 최소 6개(아마도 7개)의 시간 요소가 있습니다. 순서:
각 요소 값(예: 6), 연속 간격(9-12), 간격(8-18/4)(/는 4시간마다를 의미), 목록(1, 3, 5), 와일드카드가 될 수 있습니다. "날짜"와 "요일"이라는 두 요소는 상호 배타적이므로 둘 중 하나를 설정해야 합니다. 구성 예:
일부 하위 표현식에는 일부 범위나 목록이 포함될 수 있습니다. 예: 하위 표현식 공식(일(주))은 다음과 같습니다. 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는 일요일 이후 첫 번째 날에 해당합니다.
필드 허용되는 값 특수문자 허용 초 0~59 , - * / , - * / 분 0 ~59 , - * + , - * ? / LC # 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定时任务的处理,直接使用SpringTask注解的方式应该是最方便的,而使用Quartz从2.0开始也变得很方便。对于这两种方式,应该说各有长处吧,按需选择。
위 내용은 Spring Boot에서 여러 예약된 작업을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!