2017-01-16 6 views
0

현재 스프링 웹 애플리케이션의 배후에서 실행되는 예약 된 작업을하고 있습니다. 이 작업은 cron 스케줄러를 사용하여 매일 밤 자정에 실행하고 내 포털에 대한 사용되지 않는 응용 프로그램을 정리합니다 (내 사이트에서는 사용자가 작성하는 응용 프로그램을 작성할 수 있으며 30 일 이내에 양식에 액세스하지 않으면 내 배경 작업은 Google DB에서 해당 작업을 삭제하고 필요한 경우 전자 메일로 새 양식을 작성하도록 사용자에게 알립니다. 모든 것이 제 테스트 환경에서 훌륭하게 작동하며 QA로 이동할 준비가되었습니다.로드 밸런싱 된 서버 환경이 두 개의 전자 메일을 보내지 못하도록 차단합니다.

그러나 내 다음 환경에서는 두 개의로드 균형 조정 된 서버를 사용하여 요청을 처리합니다. cron 스케줄러와 폴링 작업이 두 서버에서 동시에 실행되므로 문제가됩니다. DB에 대한 읽기/쓰기는 문제가되지 않지만 문제는 응용 프로그램 사용자에게 알림 전자 메일을 보내는 것입니다. 폴링 잠금이 없으면 두 개의 전자 메일이 생성되어 전송 될 가능성이 있으므로이 문제를 방지하고 싶습니다. 일반적으로 우리는 SQL 저장 프로 시저를 사용하고 잠금을 위해 DB에 필드를 가지고 있으며 폴링 코드가 호출 될 때마다이를 설정/해제하므로 폴링 인스턴스 하나만 실행됩니다. 그러나 새 폴링 작업을 수행 할 때는 사용할 수있는 필드가 없으므로 SPRING 솔루션을 사용하려고합니다. 나는이 자원 온라인으로 볼 :

http://www.springframework.net/doc-latest/reference/html/threading.html

을 그리고 나는 그것을이 단지 두 번째 인스턴스 후 실행 보장한다면 잘 모르겠어요,하지만

Semaphore _pollingLock = new Semaphore(1); 
_pollingLock.aquire(); 

try { 
    //run my polling task 
} 
finally { 
    //release lock 
} 

으로 사용 생각, 또는 한 두 번째 인스턴스를 건너 뛰고 절대 실행하지 않습니다. 또는이 솔루션은 적절하지 않으며 더 나은 솔루션이 있습니다. 다시 말하지만, 스프링 자바 프레임 워크를 사용하고 있으므로 거기에 존재하는 모든 솔루션이 최선의 방법이 될 것입니다.

+1

세마포는 다른 컴퓨터의 프로세스가 아닌 스레드간에 동기화합니다. 데이터베이스 및 트랜잭션 격리 수준에 따라 두 번째 프로세스가 첫 번째 업데이트로 선택된 행을 읽을 수 없도록 차단 읽기를 사용할 수 있습니다. –

+0

@SergioMontoro 우리는 현재이 솔루션을 찾고 있습니다. 감사합니다! – user3334871

답변

0

과거에 이런 종류의 문제를 처리 한 두 가지 방법 모두 클러스터 된 서버 중 하나를 특정 작업 (예 : 이메일 전송 또는 작업 실행)을 담당하는 서버로 지정하는 것으로 시작됩니다.

하나의 솔루션에서 모든 클러스터 된 서버에 JVM 매개 변수를 설정하여 프로세스가 실행되어야하는 한 서버의 서버 이름을 식별합니다. 예 : -DemailSendServer = clusterMember1

또 다른 솔루션에서는이 지정된 서버의 시작에만 JVM 매개 변수를 제공했습니다. 예 : -DsendEmailFromMe = true

두 경우 모두 시작 매개 변수의 값 또는 존재 여부에 따라 프로세스에 약간의 코드를 추가하여 게이트를 게이트 할 수 있습니다.

매개 변수의 존재가 프로세스를 실행하기에 충분하기 때문에 두 번째 옵션을 사용하는 것이 더 간단하다는 것을 발견했습니다. 첫 번째 솔루션에서는 현재 서버 이름과 매개 변수 값을 비교해야합니다.

우리는 Spring Batch를 많이 사용하지는 않았지만 클러스터 내의 단일 서버에서도 작업을 실행하도록 Batch를 구성하는 방법이 있다고 가정합니다.

+0

답변 해 주셔서 감사합니다! 불행하게도이 환경은 서버 클러스터가 아니며이 둘 사이에 공유되는 것은 DB뿐입니다. 한 환경에서 설정 한 모든 것이 다른 구성 요소에 도달 할 수 없습니다 (나는 인프라 구조에 익숙한 팀원과상의 한 후에이 사실을 깨달았습니다). – user3334871