SpringBoot 진급 의 길 - 정시 퀘 스 트 Scheduled
spring 이 정시 퀘 스 트 so esay 를 만 드 는 데 세 가지 방법 이 있다 는 것 을 잘 알 고 있 습 니 다.
(@Scheduled)
(SchedulingConfigurer)
1. 주석 기반 (@ Scheduled)
주의해 야 할 것 은 @ Scheduled 기본 값 은 직렬 입 니 다. 단일 스 레 드 입 니 다. 여러 작업 을 시작 할 때 작업 을 수행 할 때 기 회 는 이전 작업 수행 시간의 영향 을 받 습 니 다.
@Configuration
@EnableScheduling //
public class ScheduleTask {
// 10
@Scheduled(cron = "0/10 * * * * ?")
private void configureTasks() {
System.out.println(" ");
}
}
4. 567914. 1. cron 표현 식 은 임 무 를 맞 춤 형 으로 수행 할 수 있 지만 실행 하 는 방식 은 fixed Delay 와 비슷 하 며 지난번 방법 에 따라 종료 시간 부터 계산 합 니 다.2. fixedDelay 제어 방법 이 실 행 된 간격 은 상기 방법 이 실 행 된 후에 계산 하 는 것 입 니 다. 만약 에 지난번 방법 이 실 행 된 것 이 막 혔 다 면 지난번 에 실 행 된 것 이 끝 날 때 까지 주어진 시간 을 간격 으로 다음 을 실행 합 니 다.
@Configuration
@EnableScheduling //
public class ScheduleTask {
// 10
@Scheduled(fixedDelay = 10000)
private void configureTasks() {
System.out.println(" ");
}
}
3. fixed Rate 는 일정한 속도 로 실 행 됩 니 다. 지난 번 방법 으로 실 행 된 시간 부터 계산 합 니 다. 만약 에 지난 번 방법 이 막 히 면 다음 번 에 도 실 행 될 수 없 지만 이 시간 에 실 행 될 횟수 를 누적 하고 더 이상 막 히 지 않 을 때 이 모든 것 을 한꺼번에 실행 한 다음 에 고정 속도 에 따라 계속 실 행 됩 니 다.
@Configuration
@EnableScheduling //
public class ScheduleTask {
// 10
@Scheduled(fixedRate = 10000)
private void configureTasks() {
System.out.println(" ");
}
}
4. initialDelay = 10000 은 용기 가 작 동 한 후 10 초 지연 한 후에 다시 타 이 머 를 실행 하 는 것 을 나타 낸다.
@Configuration
@EnableScheduling //
public class ScheduleTask {
// , 10 , 10 。
@Scheduled(initialDelay = 10000, fixedRate = 10000)
private void configureTasks() {
System.out.println(" ");
}
}
2. 인터페이스 기반 (SchedulingConfigurer)
일부 유인원 들 은 @ Scheduled 주 해 를 사용 하 는 것 이 매우 편리 하 다 는 것 을 발견 할 수 있 지만 단점 은 우리 가 실행 주 기 를 조정 할 때 응용 을 다시 시작 해 야 효력 이 발생 하 는데 이것 은 다소 불편 하 다 는 것 이다.실시 간 으로 효력 이 발생 하 는 효 과 를 얻 기 위해 서 는 인터페이스 로 정시 임 무 를 수행 할 수 있다.
4. 567917. 다음 사례 는 데이터 에서 실행 주기 시간 을 얻 은 다음 에 시간 임 무 를 동적 으로 수행 합 니 다. 4. 567918.
@Configuration
@EnableScheduling //
public class DynamicScheduleTask implements SchedulingConfigurer {
//
@Autowired
private MyBatisMapper myBatisMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1. (Runnable)
() -> System.out.println(" : " + LocalDateTime.now().toLocalTime()),
//2. (Trigger)
triggerContext -> {
//2.1
String cron = myBatisMapper.getCron();
//2.2 (Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
데이터베이스 테이블 데 이 터 는 다음 과 같 습 니 다.
자, 테스트 를 시작 해 봅 시다.
: 17:17:00.008999
: 17:17:20.002501
: 17:17:30.001786
: 17:17:40.005512
: 17:17:50.005870
: 17:18:00.002189
: 17:18:10.001910
우 리 는 10 초 에 한 번 씩 임 무 를 수행 하 는 것 을 볼 수 있다.그럼 지금 5 초 에 한 번 씩 집행 해 달라 고 하 는데 어떻게 해 야 하나 요?이때 우 리 는 데이터베이스 데 이 터 를 수정 하기 만 하면 되 며, 다시 시작 할 필요 가 없다.OK, 콘 솔 에 인쇄 된 것 이 무엇 인지 다시 볼 까요?
: 17:18:30.000902
: 17:18:40.001392
: 17:18:45.005027
: 17:18:50.001367
: 17:18:55.001356
: 17:19:00.001582
: 17:19:05.005676
: 17:19:10.001258
: 17:19:15.005272
5 초 에 한 번 씩 성공 적 으로 실행 합 니 다.신 나 죠 ~
3. 주 해 를 바탕 으로 다 중 스 레 드 정시 작업 설정
앞에서 말 했 듯 이 @ Scheduled 실행 주기 임 무 는 지난번 임무 의 수행 시간 에 영향 을 받 습 니 다.다 중 스 레 드 를 열 어 주기 임 무 를 수행 할 수 있 습 니 다.
@EnableScheduling // 1.
@EnableAsync // 2.
@Component
public class MultiThreadScheduleTask {
@Async
@Scheduled(fixedDelay = 1000) // 1
public void first() throws InterruptedException {
System.out.println(" : " + LocalDateTime.now().toLocalTime() + "\r
: " + Thread.currentThread().getName());
Thread.sleep(1000 * 10);
}
@Async
@Scheduled(fixedDelay = 2000)
public void second() {
System.out.println(" : " + LocalDateTime.now().toLocalTime() + "\r
: " + Thread.currentThread().getName());
}
}
콘 솔 에서 무엇 을 출력 하 는 지 항목 을 다시 시작 합 니 다.
: 17:27:01.024288
: task-4
: 17:27:01.024393
: task-7
: 17:27:02.027932
: task-4
: 17:27:05.021294
: task-1
: 17:27:05.021533
: task-1
: 17:27:06.014213
보 세 요. 다 중 스 레 드 가 열 렸 기 때문에 첫 번 째 작업 의 수행 시간 도 그 자체 의 실행 시간 에 제한 을 받 지 않 습 니 다.두 임무 도 서로 영향 을 주지 않 는 다.
다음으로 전송:https://juejin.im/post/5d415f19f265da03a715b0e1
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.