한 편의 글 은 SpringBoot 를 사용 하여 정시 임 무 를 어떻게 실현 하 는 지 가르쳐 준다.

머리말
Spring+SpringMVC 환경 에서 일반적으로 정시 임 무 를 실현 하려 면 두 가지 방안 이 있 습 니 다.하 나 는 Spring 자체 의 정시 임무 처리 장치@Scheduled 주 해 를 사용 하 는 것 입 니 다.다른 하 나 는 제3자 프레임 워 크 Quartz 를 사용 하 는 것 입 니 다.Spring Boot 는 Spring+SpringMVC 에서 기원 되 기 때문에 천연 적 으로 이 두 Spring 중의 정시 임무 실현 전략 을 갖 추고 있 습 니 다.물론 Quartz 도 지원 합 니 다.본 고 는 Spring Boot 에서 두 가지 정시 임무 의 실현 방식 을 살 펴 보 자.
1.첫 번 째 방식:@Scheduled
@Scheduled 를 사용 하 는 것 은 매우 쉽 습 니 다.Spring Boot 프로젝트 를 직접 만 들 고 spring-boot-starter-web 에 의존 하 는 웹 을 추가 합 니 다.프로젝트 생 성 에 성공 한 후@Enable Scheduling 주 해 를 추가 하여 정시 작업 을 시작 합 니 다.
在这里插入图片描述

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {

 public static void main(String[] args) {
  SpringApplication.run(ScheduledApplication.class, args);
 }

}
다음 정시 퀘 스 트 설정:

@Service
public class HelloService {
 //                       2s
 @Scheduled(fixedDelay = 2000)
 public void fixedDelay() {
  System.out.println("fixedDelay>>"+new Date());
 }
 //              2s
 @Scheduled(fixedRate = 2000)
 public void fixedRate() {
  System.out.println("fixedRate>>"+new Date());
 }
 @Scheduled(initialDelay = 2000,fixedDelay = 2000)
 public void initialDelay() {
  System.out.println("initialDelay>>>"+new Date());
 }
}
(1)우선@Scheduled 주 해 를 사용 하여 정시 작업 을 시작 합 니 다.
(2)fixedDelay 는 임무 수행 사이 의 시간 간격 을 나타 내 는데 구체 적 으로 이번 임무 가 끝 날 때 부터 다음 임무 시작 사이 의 시간 간격 을 가리킨다.
(3)fixed Rate 는 임무 수행 사이 의 시간 간격 을 나타 낸다.구체 적 으로 두 번 째 임무 의 시작 시간 간격,즉 두 번 째 임무 가 시 작 될 때 첫 번 째 임 무 는 아직 끝나 지 않 았 을 수도 있다.
(4)initialDelay 는 첫 번 째 작업 시작 지연 시간 을 표시 합 니 다.
(5)모든 시간의 단 위 는 밀리초 이다.
위 에서 이것 은 기본 적 인 용법 입 니 다.이 몇 가지 기본 속성 을 제외 하고@Scheduled 주해 도 cron 표현 식 을 지원 합 니 다.cron 표현 식 을 사용 하면 정시 작업 의 시간 을 매우 풍부 하 게 설명 할 수 있 습 니 다.cron 표현 식 형식 은 다음 과 같 습 니 다:
[초][분][시간][일][달][주][년]
在这里插入图片描述
이 부분 은 월 의 날짜 와 요일 이 충돌 할 수 있 으 므 로 설정 할 때 이 두 개 중 하 나 는?입 니 다.
어댑터 의 의미:
(1)?는 특정한 필드 의 수치 에 관심 이 없 을 때 사용 하 는 값 을 지정 하지 않 는 다 는 뜻 이다.주의해 야 할 것 은 달의 날짜 와 요일 이 충돌 할 수 있 기 때문에 설정 할 때 이 두 가 지 는?
(2)*는 모든 값 을 표시 합 니 다.예 를 들 어 초 필드 에 설정*하면 매 초 마다 트리거 됩 니 다.
(3),여러 값 을 나 누 는 데 사 용 됩 니 다.예 를 들 어 주간 필드 에'MON,WED,FRI'를 설정 하면 월요일,수요일,금요일 에 촉발 합 니 다.
(4)-은 구간 을 나타 낸다.예 를 들 어 초 에'10-12'를 설정 하면 10,11,12 초 에 모두 촉발 된다 는 뜻 이다.
(5)/은 트리거 를 증가 시 키 는 데 사 용 됩 니 다.예 를 들 어 초 에'5/15'를 설정 하면 5 초부 터 15 초 마다 트리거(5,20,35,50)를 증가 시 킵 니 다.
(6)#번호(매달 몇 번 째 주 를 나타 내 는 것),예 를 들 어 주간 필드 에'6\#3'을 설치 하 는 것 은 매달 세 번 째 토요일 을 나타 낸다.
(7)주간 필드 의 설정,영문 자 모 를 사용 하면 대소 문 자 를 구분 하지 않 습 니 다.즉,MON 과 mon 이 같 습 니 다.
(8)L마지막 뜻 을 나타 낸다.일 필드 설정 에 서 는 그 달의 마지막 날(현재 달 에 따 르 면 2 월 이면 자동 으로 윤 년 여 부 를 판단 할 수 있 음)을 나타 내 고,주 필드 에 서 는 토요일 을 나타 내 며'7'또는'SAT'(일요일 이 첫날 임 을 주의 하 세 요)에 해당 합 니 다.'L'앞 에 숫자 를 더 하면 이 데이터 의 마지막 을 나타 낸다.예 를 들 어 주간 필드 에'6L'이라는 형식 을 설정 하면'이번 달 마지막 금요일'을 나타 낸다.
(9)W은 지 정 된 날짜 의 가장 가 까 운 근무일(월요일 부터 금요일)을 나타 낸다.예 를 들 어 일 필드 에'15W'를 설정 하면 매달 15 일 에서 가장 가 까 운 근무일 에 촉발 된다.15 일이 토요일 이 라면 가장 가 까 운 금요일(14 일)을 찾 아 촉발 하고,15 일이 주 미 라면 가장 가 까 운 다음 주 1(16 일)을 찾 아 촉발 하 며,15 일이 마침 근무일(월∼금요일)이면 이 날 에 촉발 된다.'1W'형식 을 지정 하면 매월 1 일 이후 가장 가 까 운 근무일 에 촉발 된다 는 뜻 이다.1 일이 토요일 이 라면 3 일 다음 주 에 촉발 된다.주,"W"전에는 구체 적 인 숫자 만 설정 할 수 있 고 구간 은 허용 되 지 않 습 니 다."-")
(10)LW를 조합 해서 사용 할 수 있다.일 필드 에'LW'를 설정 하면 이 달 마지막 근무일 에 터치(일반적으로 급여 지급)
@Scheduled 주석 에서 5 초 간격 으로 간단 한 cron 표현 식 을 실행 합 니 다.

  @Scheduled(cron = "0/5 * * * * ?")
  public void cron() {
    System.out.println("cron>>"+new Date());
  }
在这里插入图片描述
2.두 번 째 방식:Quartz
일반적으로 프로젝트 에 서 는 정시 임무 와 관련 된 업무 가 너무 간단 하지 않 으 면@Scheduled 주 해 를 사용 하여 정시 임 무 를 해결 하지 않 으 면 대부분 Quartz 를 사용 하여 정시 임 무 를 수행 할 수 있 습 니 다.Spring Boot 에서 Quartz 를 사용 합 니 다.프로젝트 를 만 들 때 Quartz 의존 도 를 추가 하면 됩 니 다.
在这里插入图片描述
프로젝트 생 성 완료 후 정시 작업 을 시작 하 는 주 해 를 추가 해 야 합 니 다:

@SpringBootApplication
@EnableScheduling
public class QuartzApplication {
  public static void main(String[] args) {
    SpringApplication.run(QuartzApplication.class, args);
  }
}
Quartz 는 사용 과정 에서 두 가지 관건 적 인 개념 이 있 는데 하 나 는 JobDetail(할 일)이 고 다른 하 나 는 트리거(언제 할 것 인가)입 니 다.JobDetail 을 정의 하려 면 먼저 Job 을 정의 해 야 합 니 다.Job 의 정 의 는 두 가지 방식 이 있 습 니 다.
첫 번 째 방식 은 Bean 을 직접 정의 합 니 다.

@Component
public class MyFirstJob {
  public void sayHello() {
    System.out.println("first job say hello:" + new Date());
  }
}
이런 정의 방식 에 대해 두 가 지 를 말한다.
(1)우선 이 Job 을 Spring 용기 에 등록 합 니 다.
(2)이런 정의 방식 에 결함 이 하나 있 는데 바로 전 참 할 수 없다 는 것 이다.
두 번 째 정의 방식 은 QuartzJobBean 을 계승 하고 기본 적 인 방법 을 실현 하 는 것 입 니 다.

public class MySecondJob extends QuartzJobBean {
  private String name;

  public void setName(String name) {
    this.name = name;
  }

  @Override
  protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    System.out.println("second job say hello:" + name + ":" + new Date());
  }
}
첫 번 째 방식 에 비해 이 방식 은 전 참 을 지원 하고 작업 이 시 작 될 때 execute Internal 방법 이 실 행 됩 니 다.
Job 이 있 으 면 다음 클래스 를 만 들 고 JobDetail 과 Trigger 트리거 를 설정 합 니 다.다음 과 같 습 니 다.

@Configuration
public class QuartzConfig {
  @Bean
  MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
    MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
    bean.setTargetBeanName("myFirstJob");
    bean.setTargetMethod("sayHello");
    return bean;
  }

  @Bean
  JobDetailFactoryBean jobDetailFactoryBean() {
    JobDetailFactoryBean bean = new JobDetailFactoryBean();
    JobDataMap map = new JobDataMap();
    map.put("name", "Yolo");
    bean.setJobDataMap(map);
    bean.setJobClass(MySecondJob.class);
    return bean;
  }

  @Bean
  SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
    SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
    bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
    bean.setStartTime(new Date());
    bean.setRepeatInterval(2000);
    bean.setRepeatCount(3);
    return bean;
  }

  @Bean
  CronTriggerFactoryBean cronTriggerFactoryBean() {
    CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
    bean.setJobDetail(jobDetailFactoryBean().getObject());
    bean.setCronExpression("* * * * * ?");
    return bean;
  }

  @Bean
  SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean bean = new SchedulerFactoryBean();
    bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTriggerFactoryBean().getObject());
    return bean;
  }
  @Bean
  HelloService helloService() {
    return new HelloService();
  }
}
설정 설명:
(1)JobDetail 의 설정 은 두 가지 방식 이 있 습 니 다.MethodInvokingJobDetailFactoryBeanJobDetailFactoryBean.
(2)사용MethodInvokingJobDetailFactoryBean대상 빈 의 이름과 대상 방법의 이름 을 설정 할 수 있 습 니 다.이런 방식 은 전 참 을 지원 하지 않 습 니 다.
(3)사용JobDetailFactoryBean은 설정JobDetail,퀘 스 트 클래스 계승QuartzJobBean을 할 수 있 습 니 다.이런 방식 으로 전 삼 을 지원 하고 파 라 메 터 를JobDataMap에 봉 하여 전달 할 수 있 습 니 다.
(4)Trigger는 트리거 를 말 하 는데Quartz에서 여러 개의 트리거 를 정 의 했 는데 그 중에서 두 가지 용법 을 보 여 줍 니 다.SimpleTriggerCronTrigger.
(5)SimpleTrigger앞에서 말 한@Scheduled의 기본 용법 과 약간 유사 하 다.
(6)CronTrigger@Scheduled에서cron표현 식 의 용법 과 약간 유사 하 다.
在这里插入图片描述
在这里插入图片描述
Simple TriggerFactory Bean 제어 first job 를 볼 수 있 습 니 다.2 초 간격 으로 인쇄 하고 3 회 인쇄 합 니 다.
CronTriggerFactory Bean 제어 second job,1 초 간격 으로 인쇄
총결산
SpringBoot 를 사용 하여 정시 임 무 를 수행 하 는 방법 을 알려 주 는 이 글 은 여기까지 입 니 다.더 많은 SpringBoot 가 정시 임 무 를 수행 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기