2009-07-24 7 views
5

4 대의 서버가 있고 JVM이 설치되어 있습니다. 나는 Quartz가 10 분마다이 서비스를 호출하는 Java 서비스를 작성했다. 그러나 4 대의 서버에서 10 분마다 4 회의 통화가 이루어집니다. 이 sitiuation 경쟁 조건을 만듭니다. 4 JVM에서 하나의 서비스 만 원한다.스프링 프레임 워크 서로 JVM 연결하기

스프링 프레임 워크로 어떻게 할 수 있습니까?

답변

3

이것은 실제로 Quartz로 설정하기가 쉽습니다. Spring 자체는 실행중인 다른 JVM을 인식하지 못하기 때문에 여기서 많은 도움을 줄 수 없습니다. 쿼츠는 클러스터 된 스케줄러 개념을 가지고 있습니다.

기본적으로 모든 4 개의 JVM이 공유 할 수있는 단일 데이터베이스를 설정해야합니다. 이것은 4 개의 모든 인스턴스에 대한 스케줄러로 사용됩니다. 작업 스케줄이 잡히면 작업은 클러스터 된 스케줄러를 사용하는 인스턴스 중 하나에서만 실행됩니다.

클러스터링을위한 Quartz 웹 사이트 ( http://www.opensymphony.com/quartz/wikidocs/ConfigJDBCJobStoreClustering.html)에서 가져온 클러스터 된 스케줄러를 설정하는 방법에 대한 구성 예입니다. 스케쥴러를 그런 식으로 구성하는 경우 봄에서 직접 이러한 등록 정보를 설정할 수도 있습니다. 각 작업이 클러스터에 걸쳐 글로벌 잠금을 소요하는 클래스로 포장하는 작업이 실행됩니다 경우

#============================================================================ 
# Configure Main Scheduler Properties 
#============================================================================ 

org.quartz.scheduler.instanceName = MyClusteredScheduler 
org.quartz.scheduler.instanceId = AUTO 

#============================================================================ 
# Configure ThreadPool 
#============================================================================ 

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 25 
org.quartz.threadPool.threadPriority = 5 

#============================================================================ 
# Configure JobStore 
#============================================================================ 

org.quartz.jobStore.misfireThreshold = 60000 

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate 
org.quartz.jobStore.useProperties = false 
org.quartz.jobStore.dataSource = myDS 
org.quartz.jobStore.tablePrefix = QRTZ_ 

org.quartz.jobStore.isClustered = true 
org.quartz.jobStore.clusterCheckinInterval = 20000 

#============================================================================ 
# Configure Datasources 
#============================================================================ 

org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver 
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@polarbear:1521:dev 
org.quartz.dataSource.myDS.user = quartz 
org.quartz.dataSource.myDS.password = quartz 
org.quartz.dataSource.myDS.maxConnections = 5 
org.quartz.dataSource.myDS.validationQuery=select 0 from dual 
+0

감사합니다. 이것은 나를 위해 도움이 될 것입니다. 나는 그것을 시도 할 것이다. – firstthumb

3

당신의 질문이 분명하지 않기 때문에 내가 당신을 이해하는지 보자. 당신은 4 대의 서버를 가지고 있고, 각각은 VM웨어 내에서 Quartz를 실행하고 있으며 각 서버는 10 분마다 실행되도록 스케쥴 된 동일한 석영 작업을 가지고있다. cron 식을 사용합니다. 10 분마다 4 대의 서버가 모두 동일한 작업을 시작하여 동일한 작업을 동시에 수행하려고 경쟁 조건을 만듭니다.

이것은 실제로 스프링에게는 도움이되지 않습니다. 그러나 Quartz에는 클러스터링 기능이 있으며, 클러스터에서 단일 서버 만 실행하도록 작업을 구성합니다. 공유 데이터베이스를 사용하여 어떤 서버가 어떤 작업을 실행하는지 조정하고 모든 서버가 함께 작업하지 않도록합니다.

문서에는이 here에 대한 정보가 있지만 일반적인 opensymphony.com 스타일에서는 매우 희소하고 도움이되지 않습니다.

+0

나는 귀하의 설명 skaffman에 질문을 이해했습니다. 굉장해. +1. – peakit

0

내가 우리의 웹 응용 프로그램에서하는 일은 정말 신경 쓰지 않는 (I가되는 memcached를 사용하다 너무 자주), 잠금 장치가있는 경우에만 작업을 실행합니다. 작업이 완료되면 잠금을 해제 할 수 있습니다 (finally에서이 작업을 수행하는 것을 잊지 마십시오).

스케줄러를 변경하는 대신 각 작업을 래핑하는 이점 중 하나는 모든 시스템에서 실행되는 작업과 하나에서만 실행되는 작업을 가질 수 있다는 것입니다.

관련 문제