한 편의 글 은 SpringBoot 를 사용 하여 정시 임 무 를 어떻게 실현 하 는 지 가르쳐 준다.
9123 단어 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)
L
와W
를 조합 해서 사용 할 수 있다.일 필드 에'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 의 설정 은 두 가지 방식 이 있 습 니 다.
MethodInvokingJobDetailFactoryBean
과JobDetailFactoryBean
.(2)사용
MethodInvokingJobDetailFactoryBean
대상 빈 의 이름과 대상 방법의 이름 을 설정 할 수 있 습 니 다.이런 방식 은 전 참 을 지원 하지 않 습 니 다.(3)사용
JobDetailFactoryBean
은 설정JobDetail
,퀘 스 트 클래스 계승QuartzJobBean
을 할 수 있 습 니 다.이런 방식 으로 전 삼 을 지원 하고 파 라 메 터 를JobDataMap
에 봉 하여 전달 할 수 있 습 니 다.(4)
Trigger
는 트리거 를 말 하 는데Quartz
에서 여러 개의 트리거 를 정 의 했 는데 그 중에서 두 가지 용법 을 보 여 줍 니 다.SimpleTrigger
과CronTrigger
.(5)
SimpleTrigger
앞에서 말 한@Scheduled
의 기본 용법 과 약간 유사 하 다.(6)
CronTrigger
는@Scheduled
에서cron
표현 식 의 용법 과 약간 유사 하 다.Simple TriggerFactory Bean 제어 first job 를 볼 수 있 습 니 다.2 초 간격 으로 인쇄 하고 3 회 인쇄 합 니 다.
CronTriggerFactory Bean 제어 second job,1 초 간격 으로 인쇄
총결산
SpringBoot 를 사용 하여 정시 임 무 를 수행 하 는 방법 을 알려 주 는 이 글 은 여기까지 입 니 다.더 많은 SpringBoot 가 정시 임 무 를 수행 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.