Spring 동적 추가 정시 작업 의 실현 방향
업무 중 에 어떤 때 는 우리 가 일정한 시간 에 임 무 를 수행 할 때 동태 적 인 수정 이 필요 할 수 있다.예 를 들 어 보고서 생 성,어떤 항목 은 매일 8 시 에 생 성 되 고 어떤 항목 은 매일 10 시 에 생 성 된다.이런 동태 적 인 임무 수행 시간 은 분포 식 집행 을 고려 하지 않 은 상황 에서 우 리 는 할 수 있다.
Spring Task
을 사용 하여 간단하게 실현 하 다.2.수요 와 실현 사고
1.타 이 밍 작업 을 동적 으로 추가 할 수 있 습 니 다.
Spring
에 하나의 클래스ThreadPoolTaskScheduler
가 존재 하 는데 하나의cron
에 따라 하나의 임 무 를 배정 하고 하나의ScheduledFuture
대상 을 되 돌려 줄 수 있다.2.정시 임무 의 집행 을 취소 할 수 있 습 니 다.
이전 단계
ScheduledFuture
의cancel
방법 을 호출 하면 이 임 무 를 취소 할 수 있다.3.동적 수정 작업 수행 시간.
미 션 부터 취소 해.그리고 미 션 을 다시 등록 합 니 다.
4、정시 퀘 스 트 수행 이상 획득
Thread PoolTask Scheduler 클래스 에 설정
ErrorHandler
하 는 방법 이 있 습 니 다.자신 이 실현 한 ErrorHandler 를 사용 하면 됩 니 다.알림:
Spring
에서 우리 가@Scheduled
주 해 를 통 해 이 루 는 정시 임 무 는 밑바닥 도ThreadPoolTaskScheduler
을 통 해 이 루어 진다.ScheduledAnnotationBeanPostProcessor
클래스 를 통 해 볼 수 있 습 니 다.ThreadPoolTaskScheduler
의 기본 스 레 드 수 는 1 이 므 로 실제 상황 에 따라 수정 해 야 합 니 다.동적 등록 정시 작업 과 취 소 된 정시 작업 의 코드 만 보 여 줍 니 다.
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 정시 미 션 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.