4 대의 서버가 있고 JVM이 설치되어 있습니다. 나는 Quartz가 10 분마다이 서비스를 호출하는 Java 서비스를 작성했다. 그러나 4 대의 서버에서 10 분마다 4 회의 통화가 이루어집니다. 이 sitiuation 경쟁 조건을 만듭니다. 4 JVM에서 하나의 서비스 만 원한다.스프링 프레임 워크 서로 JVM 연결하기
스프링 프레임 워크로 어떻게 할 수 있습니까?
4 대의 서버가 있고 JVM이 설치되어 있습니다. 나는 Quartz가 10 분마다이 서비스를 호출하는 Java 서비스를 작성했다. 그러나 4 대의 서버에서 10 분마다 4 회의 통화가 이루어집니다. 이 sitiuation 경쟁 조건을 만듭니다. 4 JVM에서 하나의 서비스 만 원한다.스프링 프레임 워크 서로 JVM 연결하기
스프링 프레임 워크로 어떻게 할 수 있습니까?
이것은 실제로 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
당신의 질문이 분명하지 않기 때문에 내가 당신을 이해하는지 보자. 당신은 4 대의 서버를 가지고 있고, 각각은 VM웨어 내에서 Quartz를 실행하고 있으며 각 서버는 10 분마다 실행되도록 스케쥴 된 동일한 석영 작업을 가지고있다. cron 식을 사용합니다. 10 분마다 4 대의 서버가 모두 동일한 작업을 시작하여 동일한 작업을 동시에 수행하려고 경쟁 조건을 만듭니다.
이것은 실제로 스프링에게는 도움이되지 않습니다. 그러나 Quartz에는 클러스터링 기능이 있으며, 클러스터에서 단일 서버 만 실행하도록 작업을 구성합니다. 공유 데이터베이스를 사용하여 어떤 서버가 어떤 작업을 실행하는지 조정하고 모든 서버가 함께 작업하지 않도록합니다.
문서에는이 here에 대한 정보가 있지만 일반적인 opensymphony.com 스타일에서는 매우 희소하고 도움이되지 않습니다.
나는 귀하의 설명 skaffman에 질문을 이해했습니다. 굉장해. +1. – peakit
내가 우리의 웹 응용 프로그램에서하는 일은 정말 신경 쓰지 않는 (I가되는 memcached를 사용하다 너무 자주), 잠금 장치가있는 경우에만 작업을 실행합니다. 작업이 완료되면 잠금을 해제 할 수 있습니다 (finally
에서이 작업을 수행하는 것을 잊지 마십시오).
스케줄러를 변경하는 대신 각 작업을 래핑하는 이점 중 하나는 모든 시스템에서 실행되는 작업과 하나에서만 실행되는 작업을 가질 수 있다는 것입니다.
감사합니다. 이것은 나를 위해 도움이 될 것입니다. 나는 그것을 시도 할 것이다. – firstthumb