2014-10-30 3 views
1

자바 타이머를 사용하여 하루에 한 번 트리거하는 일괄 프로그램 (데이터베이스 삽입/업데이트/쿼리 프로그램) 일정이 있습니다. 이 배치 프로그램은 Apache Tomcat의 두 가지 다른 서버에서 실행됩니다.다른 서버의 다른 JVM에서 실행중인 일괄 처리 프로그램의 실행 제어

내 문제는 Java Timer API가 두 서버에서 병렬로 작업을 실행하므로 내 프로그램이 두 번 실행되기 때문에 동일한 기본 레코드가 다른 기본 키로 두 번 처리된다는 것입니다.

내 프로그램이 한 번만 트리거되고, 트리거링은 서버와 관계없이 동적으로 수행되어야합니다. 일단 배치가 시작되면 다른 배치가 시작되지 않거나 다른 배치가 처리되지 않아야합니다.

여기에서 Tomcat은 두 개의 서버에 모두 호스팅되어 있으며 동일한 응용 프로그램이 배포되어 있습니다. 두 서버에서 공유하는 하나의 데이터베이스가 있습니다.

Java 및 스프링이 사용됩니다.

위의 문제에 대한 해결책으로 제안/도움이 필요합니다.

답변

0

클러스터 환경에서 작업 실행을 지원하는 Quartz과 같은 작업 스케줄링 라이브러리를 사용하십시오.
Quartz는 정확하게 하나의 노드가 작업을 실행하여 작업의 중복 실행을 방지 할 수있는 기능이 있습니다. 자세한 내용은 here을 참조하십시오.
Spring은 TaskExecutor 및 TaskScheduler 인터페이스를 사용하여 비동기 실행 및 작업 스케줄링을위한 추상화를 제공합니다. Spring은 Quartz Scheduler로 스케줄링을 지원하기위한 통합 클래스를 제공한다. 자세한 내용은 here을 참조하십시오.

Java 타이머를 계속 사용하려면 동기화를 직접 처리해야합니다. 공유 솔루션은 공유 잠금 데이터베이스 테이블을 사용하고 있습니다. 2 노드가 동시에 잠금 테이블에서 읽기/쓰기를 시도 할 때 동시성 문제가 발생하지 않도록주의해야합니다.

+0

감사합니다.하지만 Java Timer 자체에서 동일한 결과를 얻길 바랍니다. –

관련 문제