Spring 동적 추가 정시 작업 의 실현 방향

4489 단어 Spring정시 임무
배경
업무 중 에 어떤 때 는 우리 가 일정한 시간 에 임 무 를 수행 할 때 동태 적 인 수정 이 필요 할 수 있다.예 를 들 어 보고서 생 성,어떤 항목 은 매일 8 시 에 생 성 되 고 어떤 항목 은 매일 10 시 에 생 성 된다.이런 동태 적 인 임무 수행 시간 은 분포 식 집행 을 고려 하지 않 은 상황 에서 우 리 는 할 수 있다.Spring Task을 사용 하여 간단하게 실현 하 다.
2.수요 와 실현 사고
1.타 이 밍 작업 을 동적 으로 추가 할 수 있 습 니 다.Spring에 하나의 클래스ThreadPoolTaskScheduler가 존재 하 는데 하나의cron 에 따라 하나의 임 무 를 배정 하고 하나의ScheduledFuture대상 을 되 돌려 줄 수 있다.
可以看到返回值是ScheduledFuture对象
2.정시 임무 의 집행 을 취소 할 수 있 습 니 다.
이전 단계ScheduledFuturecancel방법 을 호출 하면 이 임 무 를 취소 할 수 있다.
3.동적 수정 작업 수행 시간.
미 션 부터 취소 해.그리고 미 션 을 다시 등록 합 니 다.
4、정시 퀘 스 트 수행 이상 획득
Thread PoolTask Scheduler 클래스 에 설정ErrorHandler하 는 방법 이 있 습 니 다.자신 이 실현 한 ErrorHandler 를 사용 하면 됩 니 다.
定时任务错误处理
알림:
  • Spring에서 우리 가@Scheduled주 해 를 통 해 이 루 는 정시 임 무 는 밑바닥 도ThreadPoolTaskScheduler을 통 해 이 루어 진다.ScheduledAnnotationBeanPostProcessor클래스 를 통 해 볼 수 있 습 니 다.
  • ThreadPoolTaskScheduler의 기본 스 레 드 수 는 1 이 므 로 실제 상황 에 따라 수정 해 야 합 니 다.
  • 3.코드 구현
    동적 등록 정시 작업 과 취 소 된 정시 작업 의 코드 만 보 여 줍 니 다.
    
    package com.huan.study.task.jobs.tasks;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.support.CronExpression;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author huan.fu 2021/7/8 -   2:46
     */
    @Component
    @Slf4j
    public class DynamicCronTask implements InitializingBean {
    
        @Autowired
        private ThreadPoolTaskScheduler taskScheduler;
    
    
        private ScheduledFuture<?> scheduledFuture;
    
        @Override
        public void afterPropertiesSet() throws Exception {
            //           
            log.info("        :  1     ");
            scheduledFuture = register("* * * * * ?");
    
            //       
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(5);
                    log.info("    ");
                    scheduledFuture.cancel(false);
                    log.info("    :" + scheduledFuture.isCancelled());
                    log.info("          :  2     ");
                    register("*/2 * * * * ?");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    
        private ScheduledFuture<?> register(String cron) {
    
            //       CronExpression,      CronSequenceGenerator
            boolean validExpression = CronExpression.isValidExpression(cron);
            log.info("cron:[{}]     :[{}]", cron, validExpression);
    
            CronExpression expression = CronExpression.parse(cron);
            LocalDateTime nextExecTime = expression.next(LocalDateTime.now());
            if (null != nextExecTime) {
                log.info("            :[{}]", nextExecTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            }
    
            return taskScheduler.schedule(new Runnable() {
                @Override
                public void run() {
                    log.info("    ");
                }
            }, new CronTrigger(cron));
        }
    }
    4.집행 결과
    执行结果
    전체 코드
    https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-task
    Spring 동적 으로 정시 미 션 을 추가 하 는 실현 방향 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring 정시 미 션 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기