2013-12-11 1 views
1

우리는 데이터베이스 테이블의 각 레코드에 대해 웹 서비스를 사용하여 외부 시스템에 업데이트를 보내는 Stateful Quartz 작업을 가지고 있습니다 레코드 당 외부 시스템으로 전송). 외부 시스템에 대한 갱신이 성공적이면 레코드가 데이터베이스에서 삭제됩니다.Stateful Quartz 작업이 노드 1에서 실행을 완료하기 전에 노드 2에서 실행되기 시작

트리거가 6 초마다 실행되도록 구성됩니다. 그리고 작업은 일반적으로 1 초 안에 실행을 완료합니다. 우리의 응용 프로그램은 클러스터 된 환경에서 실행됩니다. quartz.properties 파일에 다음과 같은 내용이 있습니다.

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.jobStore.isClustered = true 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.misfireThreshold = 60000 

이 작업은 상태 저장 작업이기 때문에 동시에 실행되지 않을 것으로 예상됩니다. 거의 항상 예상대로 작동했습니다. 그러나 때때로, 우리는 동시에 우리에게 어떤 이슈를 일으키는 작업이 진행되는 것을 봅니다.

처형의 타이밍은 다음과 같습니다 :

노드 1 :

Trigger 1 start time - 14:54:12 (picks record with id 10) 
Trigger 1 end time - 14:54:33 (finishes after trigger 2 and tries to delete the record which is already deleted by trigger 2) 

노드 2 :

Trigger 2 start time - 14:54:22 (this also picks the record with id 10) 
Trigger 2 end time - 14:54:23 (finishes before trigger 1 and deletes the record in the database) 

우리는 org.quartz.jobStore.clusterCheckinInterval을 설정하지 않은 속성이므로 quartz 1.x 문서 (우리는 석영 1.6.0 사용)에 따라 15000 ms가되어야한다.

노드에서 시스템 시간을 확인했으며 동기화되어 있습니다.

누군가이 문제의 원인을 이해하는 데 도움을 줄 수 있습니까?

그리고 작업 트리거 빈도는 org.quartz.jobStore.clusterCheckinInterval과 어떤 관련이 있습니까?

감사합니다.

답변

관련 문제