SpringBoot 진급 의 길 - 정시 퀘 스 트 Scheduled

많은 파트너 들 이 실제 개발 에서 특정한 업무 논 리 를 정기 적 으로 수행 해 야 할 때 해결 방안 이 매우 많다. 예 를 들 어 MQ.하지만 여기 서 블 로 거들 은 spring boot 가 제공 하 는 비교적 좋 은 정시 작업 구성 요소 인 Schedule 을 소개 한다.
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

    좋은 웹페이지 즐겨찾기