회사에서 개발한 서비스(IR)에 있는 배치 모듈에 버그가 있어서 수정을 해야한다. BUT 내가 개발 안함 HOWEVER 개발한 사람은 퇴사함. 그리고 나는 이걸 직접 해결해보고 싶음. 하지만 Quartz에 대해 아는게 없어서 소스를 봐도 띠용때용한 상태라 간단하게 개념 정리를 하고 버그 수정을 해야겠다.
버그 내용은 다음과 같다.
톰캣 서버를 ./shutdown으로 죽여도 톰캣 프로세스가 살아있는데 그게 스케쥴러가 죽지 않아서... 인 것 같다는 것이다.. 내가 분석한게 아니라 다른 사람이 분석한 것. 웹서비스에 붙어있는 스케쥴러가 어떠한 연유로 톰캣을 죽여도 죽지 않는지는 모르겠음.
출처 : http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/tutorials/
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
번역 귀찮아서 문서 파파고 돌림
Job's 트리거가 실행되면(순간에 더 많은 트리거가 실행됨), execute(...) 메서드는 스케줄러의 작업자 스레드 중 하나에 의해 호출됩니다. 이 메서드에 전달되는 JobExecutionContext 개체는 작업 인스턴스의 "실행 시간" 환경에 대한 정보(실행된 스케줄러에 대한 핸들, 실행을 트리거한 트리거에 대한 핸들, 작업의 JobDetail 개체 및 기타 몇 가지 항목)를 제공합니다.
JobDetail 개체는 Job이 스케줄러에 추가될 때 Quartz 클라이언트(사용자의 프로그램)에 의해 생성됩니다. 여기에는 작업에 대한 다양한 속성 설정과 작업 클래스의 지정된 인스턴스에 대한 상태 정보를 저장하는 데 사용할 수 있는 작업 데이터 맵이 포함됩니다. 이는 기본적으로 작업 인스턴스의 정의이며, 다음 강의에서 자세히 설명합니다.
트리거 개체는 작업의 실행(또는 '발사')을 트리거하는 데 사용됩니다. 작업을 예약하려면 트리거를 인스턴스화하고 해당 속성을 '조정'하여 원하는 예약을 제공합니다. 트리거에는 JobDataMap이 연결되어 있을 수도 있습니다. 이는 트리거의 발생과 관련된 Job에 파라미터를 전달하는 데 유용합니다. Quartz에는 몇 가지 다른 트리거 유형이 포함되어 있지만 가장 일반적으로 사용되는 유형은 SimpleTrigger 및 CronTrigger입니다.
SimpleTrigger는 '원샷' 실행(특정 시점에 작업을 한 번만 실행)이 필요하거나, 특정 시간에 작업을 실행하고 실행 간에 T의 지연 시간으로 N회 반복해야 하는 경우에 유용합니다. CronTrigger는 "매주 금요일 정오" 또는 "매월 10일 10:15"와 같은 일정에 따라 트리거링을 수행하려는 경우 유용합니다
작업 및 트리거가 필요한 이유? 대부분의 작업 스케줄러에는 작업 및 트리거에 대한 별도의 개념이 없습니다. 일부에서는 '작업'을 일부 작은 작업 식별자와 함께 단순한 실행 시간(또는 예약)으로 정의합니다. 다른 것들은 Quartz의 작업과 트리거 객체의 결합과 비슷합니다. Quartz를 개발하면서 우리는 일정과 그 일정에 따라 수행할 작업을 분리하는 것이 타당하다고 판단했습니다. 이것은 많은 이점이 있다고 생각합니다.
예를 들어 트리거와 관계없이 작업을 생성하고 작업 스케줄러에 저장할 수 있으며 여러 트리거를 동일한 작업에 연결할 수 있습니다. 이 느슨한 결합의 또 다른 이점은 연결된 트리거가 만료된 후에도 스케줄러에 남아 있는 작업을 구성할 수 있다는 것입니다