기술은 날마다 끊임없이 변화하고 있습니다. 때로는 서버에서 주기적으로 작업을 실행해야 하는 경우도 있습니다. 서버에서 작업을 수동으로 실행하는 것은 어려운 작업이므로 사용자나 관리자가 여러 번 수행할 수 없습니다. 이 문제를 해결하기 위해, 크론 프로그래머가 서버에서 주기적으로 작업을 실행하는 데 도움이 됩니다. 자동화된 시스템 유지 관리 및 감상에 널리 사용됩니다. 이 외에도 다음을 사용할 수도 있습니다. 크론 표현 웹 개발 중. 웹 애플리케이션이 특정 작업을 주기적으로 실행해야 하는 상황이 많이 있습니다.
이 섹션에서는 자바 크론 표현식 , 그것은 다음을 통해 작동하고 구현됩니다. Java Quartz 스케줄러 .
크론이란 무엇입니까?
기본적으로 Cron은 작업을 예약하는 유틸리티입니다. 이를 통해 사용자는 지정된 시간, 날짜, 월, 약한 및 연도에 주기적으로 작업을 예약할 수 있습니다. 사람의 개입이 필요하지 않은 자동화된 프로세스에 널리 사용됩니다.
크론 표현
Java에서는 Cron 표현식을 사용하여 인스턴스를 구성합니다. 크론트리거 수업. 의 하위 클래스입니다. org.quartz.트리거 수업. Cron 표현식은 6개 또는 7개의 필드(시간 단위)로 구성된 문자열 또는 표현식입니다. 스케줄 및 명령어에 대한 개별적인 내용을 설명합니다.
cron 표현식은 간단할 수도 있고 복잡할 수도 있습니다. 예를 들어,
단순한: * * * * ? * (별표는 필드를 나타냄)
복잡한: 0 0/4 12,15,3-35,52 ? 2002-2010년 5월, 6월, 7월 화요일-토요일.
또한 Cron 표현식은 다음과 같이 다양한 스타일로 작성될 수 있습니다. 예를 들어 다음 세 가지 Cron 표현식은 동일한 의미를 갖습니다.
- 0109? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
세 가지 표현식은 모두 매일 오전 9시 10분에 실행됩니다.
Cron 표현식에 사용되는 필드
Cron 표현식에서 시간 단위는 다음과 같습니다. 필드 . 이는 공백으로 구분되며 해당 필드에 허용되는 문자의 다양한 조합과 함께 허용되는 값을 포함할 수 있습니다. 예상된 순서로 필드를 표시합니다. 다음 표에는 표현식과 함께 사용할 수 있는 시간 단위와 해당 값, 기호가 나와 있습니다.
분야 명 | 필수의 | 허용되는 값 | 필드에 허용되는 특수 문자 및 기호 |
---|---|---|---|
초 | 예 | 0-59 | , - * / |
분 | 예 | 0-59 | , - * / |
시간 | 예 | 0-23 | , - * / |
해당 월의 일 | 예 | -31 | , - * ? / 패 승 C |
월 | 예 | 0~11 또는 1월~12월 | , - * / |
요일 | 예 | 1-7 또는 SUN-SAT | , - * ? / LC # |
년도 | 선택 과목 | 비어 있거나 1970-2099 | , - * / |
Cron 표현식에 사용되는 특수 기호 및 문자
별표(*): 매 시간 단위(분, 초, 시)마다 이벤트를 실행하고자 할 때 사용하는 기호입니다. 예를 들어 *를 분 시간 단위로 사용하면 1분마다 자동으로 이벤트가 실행된다는 의미입니다.
물음표 (?): 기호는 날짜, 요일과 같은 필드에 사용됩니다. 임의의 값을 나타내고 필드 값을 무시합니다. 매월 2일이 무슨 요일인지 상관하지 않고 매월 2일에 스크립트를 실행하고 싶다고 가정해 보겠습니다. 이 경우 물음표 기호( ?) 요일 필드에.
하이픈(-): 기호는 범위를 지정하는 데 사용됩니다. 값의 범위를 결정합니다. 예를 들어 시간 필드가 다음과 같이 정의된 경우 , 이벤트가 4시간과 5시간에 실행된다는 의미입니다.
반점 (,): 쉼표로 구분된 필드 값을 정의하는 데 사용됩니다. 예를 들어 금, 토, 일 등입니다.
슬래시(/): 지정된 시간 단위의 값을 증가시키는 데 사용됩니다. 10분에 이벤트를 시작하고 그 이후에는 20분에 동일한 이벤트를 실행하고, 다음 실행은 30분에 실행해야 하는 식으로 진행된다고 가정해 보겠습니다. 이 경우 시작 시간과 증분 값을 슬래시로 구분하여 지정합니다.
자바 수학 펑
예를 들어, 10/10 분 필드에 지정된 경우 첫 번째 이벤트가 10분에 실행되고 다음 실행이 20분에 실행된다는 의미이므로 그렇지 않습니다.
L(마지막): L의 사용은 다양한 분야에서 다른 의미를 갖습니다.
- 해당 분야에서 사용된 경우 필드에서는 달력에 따라 해당 월의 마지막 날을 나타냅니다.
- 다음과 같은 오프셋 값과 함께 사용된 경우 L-5 . 5를 나타냅니다.일해당 월의 마지막 날까지.
- 해당 분야에서 사용된 경우 필드에서는 해당 주의 마지막 날을 나타냅니다. 필드의 다른 값과 함께 사용할 수도 있습니다. 예를 들어, 7L 을 나타냅니다 지난 토요일 .
안에: 나중은 평일(월요일부터 금요일까지)을 나타냅니다. 해당 월의 지정된 날짜에 가장 가까운 평일을 결정합니다.
예를 들어, 우리가 지정한다면 5W day of Month 필드에서는 5에 가까운 평일을 결정한다는 의미입니다.일달의.
- 만약 5일그 달은 토요일 , 이벤트가 실행됩니다 9일 달의.
- 만약 5일그 달은 일요일 , 이벤트가 실행됩니다 열하나일 달의.
또 다른 경우가 있을 수도 있습니다. 가정하다 , 1성매월 토요일이고 3일에 이벤트가 발생합니다rd달의. 이는 이전 달에 이벤트나 스크립트가 실행되지 않음을 의미합니다.
해시(#): 해당 월의 n번째 평일을 나타냅니다. 예를 들어, 매월 세 번째 금요일은 다음과 같이 표시될 수 있습니다. 6#3 .
왜 cron 표현식을 사용해야 합니까?
cron 표현식을 사용하는 데에는 여러 가지 이유가 있습니다. 그 중 일부는 다음과 같습니다:
- 특정 간격으로 캐시된 데이터 파일을 만료하고 삭제할 수 있습니다.
- 매일 뉴스레터와 이메일을 예약할 수 있습니다.
- 웹 스크립트에서 실행하는 대신 명령줄 스크립트에서 실행되도록 장기 실행 작업을 예약할 수 있습니다. 비디오를 인코딩하거나 대량 이메일을 보내는 것과 같습니다.
크론 표현식의 예
특수 기호와 필드를 사용하는 몇 가지 일반적인 Cron 표현식을 살펴보겠습니다.
크론 표현 | 크론 표현식의 의미 |
---|---|
0 12 * * ? | 매일 오후 12시(정오)에 작업이 실행됨을 나타냅니다. |
0/5 13.18 * * ? | 이는 매일 오후 1시에 시작하여 오후 1시 55분에 종료되고 오후 6시에 시작하여 오후 6시 55분에 종료되는 작업이 5분마다 실행됨을 나타냅니다. |
0-5 13 * * ? | 이는 작업이 매일 오후 1시부터 오후 1시 5분까지 매분마다 실행됨을 나타냅니다. |
15,45 13? 6화 | 이는 6월 매주 화요일 오후 1시 15분과 오후 1시 45분에 작업이 실행됨을 나타냅니다. |
30 9? * 월~금 | 매주 월요일, 화요일, 수요일, 목요일, 금요일 오전 9시 30분에 작업이 실행됨을 나타냅니다. |
30 9 15 * ? | 매월 15일 오전 9시 30분에 작업이 실행됨을 나타냅니다. |
0 18L * ? | 이는 매월 마지막 날 오후 6시에 작업이 실행됨을 나타냅니다. |
0 18 L-3 * ? | 매월 3일부터 말일까지 오후 6시에 작업이 실행됨을 나타냅니다. |
30 10? *5L | 이는 매월 마지막 목요일 오전 10시 30분에 작업이 실행됨을 나타냅니다. |
0 10 ? * 23 | 이는 매월 세 번째 월요일 오전 10시에 작업이 실행됨을 나타냅니다. |
0 0 10/5 * ? | 매월 10일부터 5일 동안 매일 자정 12시에 작업이 실행됨을 나타냅니다. |
0 11 11 11 11 ? | 이는 작업이 매년 11월 11일 오전 11시 11분에 실행됨을 나타냅니다. |
0 15 10 ? * 6L 2002-2005 | 2002년, 2003년, 2004년, 2005년 동안 매월 마지막 금요일 오전 10시 15분에 실행됩니다. |
0 0 0? * 마이#1 | 이는 해당 월의 첫 번째 월요일 자정에 작업이 실행됨을 나타냅니다. |
0 0 0 LW * * | 이는 해당 월의 마지막 주중 자정에 작업이 실행됨을 나타냅니다. |
0 0/30 8-10 * * * | 이는 작업이 매일 8:00, 8:30, 9:00, 9:30, 10:00 및 10:30에 실행됨을 나타냅니다. |
Cron 표현식의 특수 설정
위의 특수 기호 외에도 Cron 표현식은 사전 정의된 특수 값도 지원합니다. 이러한 값은 필드 대신 사용할 수 있습니다.
Java에서 Cron 표현식 사용
Java는 특정 시간 단위에 대해 작업을 예약하는 오픈 소스 작업 예약 시스템을 제공합니다. Quartz 스케줄러는 공식 사이트에서 다운로드할 수 있습니다.
프로그래밍 측면에서 작업은 실행할 작업을 포함하는 클래스입니다. 하지만 문제는 일정을 어떻게 잡느냐이다. 작업 예약을 위해 트리거를 정의하고 작업 실행 시기를 지정합니다.
Quartz 스케줄러를 구현하려면 다음과 같이 종속성을 추가할 수 있습니다.
org.quartz-scheduler quartz 2.2.1
참고: 다음 Java 프로그램을 실행하기 전에 다음을 추가했는지 확인하십시오. 석영-2.2.1.jar 경로에 파일을 저장하지 않으면 오류가 발생합니다.
Java 프로그램을 통해 cron 표현식과 작업을 구현하는 방법을 살펴보겠습니다.
1 단계: 메이븐 프로젝트를 생성합니다. 우리는 이름으로 만들었습니다 크론예제 .
2 단계: 프로젝트 내에서 두 개의 패키지를 만듭니다. com.javatpoint.app 그리고 com.javatpoint.job . 첫 번째 패키지에서는 메인 클래스를 정의하고 두 번째 패키지에서는 작업을 정의합니다(이 경우 작업 수는 5개입니다).
3단계: pom.xml 파일에 다음 종속성을 붙여넣습니다. 프로젝트에 필요한 JAR 파일을 자동으로 다운로드합니다. pom 파일은 다음과 같습니다.
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
4단계: 실행하려는 5개의 작업(com.javatpoint.job 패키지에서)을 생성하십시오. 우리의 경우 다음과 같은 5가지 작업을 정의했습니다.
엑셀 단축키 모두 대문자
Job1.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job1 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job1 --->>> Hello user! Time is ' + new Date()); } }
Job2.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job2 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job2 --->>> Hello user! Time is ' + new Date()); } }
Job3.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job3 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job3 --->>> Hello user! Time is ' + new Date()); } }
Job4.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job4 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job4 --->>> Hello user! Time is ' + new Date()); } }
Job5.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job5 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job5 --->>> Hello user! Time is ' + new Date()); } }
5단계: MyApp이라는 이름의 기본 클래스를 만듭니다.
MyApp.java
package com.javatpoint.app; import org.quartz.CronExpression; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import com.javatpoint.job.Job1; import com.javatpoint.job.Job2; import com.javatpoint.job.Job3; import com.javatpoint.job.Job4; import com.javatpoint.job.Job5; public class MyApp { public static void main(String args[]) { try { JobDetail job1 = JobBuilder.newJob(Job1.class) .withIdentity('job1', 'group1').build(); Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger1', 'group1') .withSchedule(CronScheduleBuilder.cronSchedule('0/5 * * * * ?')) .build(); Scheduler scheduler1 = new StdSchedulerFactory().getScheduler(); scheduler1.start(); scheduler1.scheduleJob(job1, trigger1); JobDetail job2 = JobBuilder.newJob(Job2.class) .withIdentity('job2', 'group2').build(); Trigger trigger2 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger2', 'group2') .withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression('0/7 * * * * ?'))) .build(); Scheduler scheduler2 = new StdSchedulerFactory().getScheduler(); scheduler2.start(); scheduler2.scheduleJob(job2, trigger2); JobDetail job3 = JobBuilder.newJob(Job3.class) .withIdentity('job3', 'group3').build(); Trigger trigger3 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger3', 'group3') .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(13, 46)) .build(); Scheduler scheduler3 = new StdSchedulerFactory().getScheduler(); scheduler3.start(); scheduler3.scheduleJob(job3, trigger3); JobDetail job4 = JobBuilder.newJob(Job4.class) .withIdentity('job4', 'group4').build(); Trigger trigger4 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger4', 'group4') .withSchedule(CronScheduleBuilder.weeklyOnDayAndHourAndMinute(3, 13, 46)) .build(); Scheduler scheduler4 = new StdSchedulerFactory().getScheduler(); scheduler4.start(); scheduler4.scheduleJob(job4, trigger4); JobDetail job5 = JobBuilder.newJob(Job5.class) .withIdentity('job5', 'group5').build(); Trigger trigger5 = TriggerBuilder .newTrigger().withIdentity('cronTrigger5', 'group5') .withSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(28, 13, 46)) .build(); Scheduler scheduler5 = new StdSchedulerFactory().getScheduler(); scheduler5.start(); scheduler5.scheduleJob(job5, trigger5); Thread.sleep(100000); scheduler1.shutdown(); scheduler2.shutdown(); scheduler3.shutdown(); scheduler4.shutdown(); scheduler5.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
위의 모든 단계를 완료하면 프로젝트 디렉터리는 다음과 같습니다.
6단계: 위의 Java 프로그램을 실행하여 출력을 확인하세요.
우리는 모든 작업이 특정 시간 간격으로 실행되는 것을 관찰합니다.