2013-07-18 5 views
3

저는 Quartz와 함께 프로젝트 작업을하고 있으며 작업에 대한 종속성에 문제가있었습니다.quartz-scheduler 의존 작업

A와 B가 동시에 실행할 수 있지만 A와 B가 모두 완료되면 C 만 실행할 수 있습니다 C는 비록

우리는 A와 B가 서로에 의존하지 않는 셋업이있다.

A와 B가 완료 될 때만 C가 트리거되도록이 종류의 시나리오를 Quartz로 설정하는 방법이 있습니까?

답변

3

직접 AFAIK 아니지만 TriggerListener을 사용하여 이러한 기능을 구현하는 것이 너무 어렵지 않아야합니다 (TriggerListener는 작업의 시작과 끝 모두 실행되며 개별 트리거 나 트리거 그룹에 대해 설정할 수 있음) .

편집 : 현재이

을 체인에는 "직접"또는 "무료"방법은 석영으로 트리거되지 않은 : 거기에도이 문제에 대한 FAQ Topic 특정입니다. 그러나 많은 노력 없이는이를 수행 할 수있는 몇 가지 방법이 있습니다. 다음은 몇 가지의 개요는 접근한다 :

한 가지 방법은 수신기를 사용하는 것입니다 (즉 TriggerListener, JobListener 또는 SchedulerListener) 작업/트리거의 완료를 통지하고 는 즉시 불에 새로운 트리거를 예약 할 수 있습니다 . 이 방법을 사용하면 이 조금 복잡해 지므로 수신자에게 이라는 작업이 어떤 것인지 알릴 필요가 있으므로이 정보의 지속성에 대해 걱정할 필요가 있습니다. Quartz와 함께 제공되는 리스너 org.quartz.listeners.JobChainingJobListener를 참조하십시오. 이미이 기능 중 일부가 있으므로 이 있습니다.

또 다른 방법은 다음 작업의 이름을 발사하기 위해 JobDataMap 내에 포함 된 작업을 구축하는 것입니다, 그리고 작업 (그것의 실행() 메소드의 마지막 단계 를) 완료로 다음 작업을 예약 작업이 . 몇 가지 사람들이 이것을하고 행운을 빕니다. 대부분의 사람들은 미리 정의 된 키 (상수)를 사용하여 작업 이름을 가져 오는 방법을 알고있는 그룹을 JobDataMap 밖으로 가져와 에 식별 된 작업을 예약하는 코드를 포함하는 기본 클래스 인 (추상) 클래스를 만들었습니다. 이 abstract Job의 execute() 구현은 과 같은 추상 템플릿 메소드 (확장 Job 클래스의 실제 작업 진행 위치) "doWork()"에 위임 한 다음 후속 작업을 예약하기위한 코드를 포함합니다. 그런 다음 그들은 단순히이 클래스의 확장 기능을 포함하여 작업해야 할 작업을 포함합니다. '내구성'작업 또는 과부하 된 addJob (JobDetail, boolean, boolean) 메소드 (Quartz 2.2에 추가됨)를 사용하면 응용 프로그램이 적절한 데이터 (즉, )를 사용하여 모든 작업을 한번에 정의 할 수 있습니다. ( 에 대한 하나의 방아쇠를 제외하고는 체인에서 첫 번째 작업을 시작하십시오).

미래에는 Quartz가 훨씬 더 깨끗한 방법을 제공하지만, 그 전에는 을 사용하거나 위의 방법 중 하나를 사용해야하거나 더 잘 작동하는 것으로 생각하는 을 사용해야합니다.