spring-boot 다 중 스 레 드 병행 정시 작업 솔 루 션

방금 Spring Boot 가 정시 임 무 를 수행 하 는 글 을 봤 는데 괜 찮 은 것 같 아 요.Spring Boot 는 Spring 자체 의 Schedule 을 사용 하여 정시 임 무 를 수행 하 는 것 이 매우 간단 하고 편리 해 졌 다.여기 있 습 니 다.
캐 시 주석 열기

@SpringBootApplication
@EnableScheduling //      
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
정시 작업 작성

@Component
public class ScheduledTasks {
  private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
  // cron  cron   ,  cron         
  @Scheduled(cron="0/5 * * * * ? ")  // 5      
  public void testCron() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
   logger.info(sdf.format(new Date())+"********* 5     ");
  }
}
임무 완수
프로젝트 를 시작 하고 콘 솔 인쇄 정 보 를 보 니 정시 작업 이 유효 합 니 다.spring boot 와 Scheduled 통합 완료.

문제 가 있다
그러나 나중에 문 제 를 발견 했다.몇 가지 임 무 를 동시에 테스트 한 결과 모든 임 무 는 같은 스 레 드 탱크 의 같은 스 레 드 에서 이 루어 진 것 을 발견 했다.실제 개발 과정 에서 우 리 는 당연히 모든 임무 가 한 라인 에서 실행 되 는 것 을 원 하지 않 는 다.

@Scheduled(cron="0/1 * * * * ? ")  // 1      
public void testCron1() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  logger.info(sdf.format(new Date())+"********* 1     ");
}
@Scheduled(cron="0/2 * * * * ? ")  // 2      
public void testCron2() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  logger.info(sdf.format(new Date())+"********* 2     ");
}
@Scheduled(cron="0/3 * * * * ? ")  // 3      
public void testCron3() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  logger.info(sdf.format(new Date())+"********* 3     ");
}
@Scheduled(cron="0/4 * * * * ? ")  // 4      
public void testCron4() {
  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  logger.info(sdf.format(new Date())+"********* 4     ");
}

해결 방안
그렇다면 어떻게 다 중 스 레 드 로 설계 하여 병발 을 실현 합 니까?인터넷 에서 이런 해결 방안 을 본 적 이 있다.ScheduleConfig 설정 파일 을 통 해 Scheduling Configurer 인 터 페 이 스 를 실현 하고 setSchedulerfang 방법 을 다시 작성 합 니 다.설정 을 시도 해 보 았 습 니 다.

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
   taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
 }
}
통합 성공
이렇게 하면 다 중 스 레 드 병행 설정 이 완 료 됩 니까?우 리 는 프로젝트 를 시작 하여 콘 솔 출력 정 보 를 통 해 결 과 를 검증 한 결과 모든 작업 이 같은 스 레 드 탱크 에 있 지만 서로 다른 스 레 드 에서 이 루어 진 것 을 발견 했다.이 방안 이 완전히 실행 가능 하 다 는 것 을 설명 한다.그러면 우 리 는 spring boot 다 중 스 레 드 와 정시 임 무 를 완성 할 수 있다.

주석.
@Scheduled 가 지원 하 는 인자:
1.cron:cron 표현 식,지정 한 작업 이 특정 시간 에 실 행 됩 니 다.2.fixedDelay:지난 작업 이 완 료 된 후 얼마나 자주 다시 실 행 했 는 지,매개 변수 유형 은 long,단위 ms 임 을 나타 낸다.3.fixedDelayString:fixedDelay 의 의미 와 마찬가지 로 매개 변수 유형 만 String 으로 변 합 니 다.4.fixed Rate:일정한 주파수 에 따라 작업 을 수행 하고 매개 변수 유형 은 long,단위 ms 임 을 나타 낸다.5.fixed Rate String:fixed Rate 의 의미 와 같이 매개 변수 유형 만 String 으로 바 꿉 니 다.6.initialDelay:얼마나 지연 되 고 처음으로 임 무 를 수행 하 는 지 표시 합 니 다.매개 변수 유형 은 long 이 고 단위 ms 입 니 다.7.initialDelayString:initialDelay 의 의미 와 마찬가지 로 매개 변수 유형 만 String 으로 바 꿉 니 다.8.zone:시간 대,기본 값 은 현재 시간 대 입 니 다.일반적으로 사용 되 지 않 습 니 다.
Cron 표현 식 범례:
5 초 간격 으로 실행:*/5***?1 분 간격 으로 실행:0*/1***?매일 23 시 에 한 번 실행:0,23*?매일 새벽 1 시 에 한 번 씩 실행:0.01*?매달 1 일 새벽 1 시 에 한 번 씩 실행 합 니 다.0,01,1*?매월 마지막 날 23 시 에 한 번 실행:0,23 L*?매주 일요일 새벽 1 시 에 한 번 씩:0.01?*L 은 26 점,29 점,33 점 에서 한 번 집행 한다.0 26,29,33**?매일 0 시,13 시,18 시,21 시 에 한 번 씩 실행 합 니 다.0 0,0,13,18,21*?
사실 Cron 표현 식 도 걱정 하지 마 세 요.인터넷 에 많은 온라인 Cron 생 성기 가 있 습 니 다.우 리 는 온라인 생 성 기 를 통 해 요구 에 부 합 된 cron 을 생 성 할 수 있 고 편리 합 니 다.
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 spring-boot 다 중 스 레 드 와 정시 미 션 의 해결 방안 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기