현재 스프링 웹 애플리케이션의 배후에서 실행되는 예약 된 작업을하고 있습니다. 이 작업은 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
}
으로 사용 생각, 또는 한 두 번째 인스턴스를 건너 뛰고 절대 실행하지 않습니다. 또는이 솔루션은 적절하지 않으며 더 나은 솔루션이 있습니다. 다시 말하지만, 스프링 자바 프레임 워크를 사용하고 있으므로 거기에 존재하는 모든 솔루션이 최선의 방법이 될 것입니다.
세마포는 다른 컴퓨터의 프로세스가 아닌 스레드간에 동기화합니다. 데이터베이스 및 트랜잭션 격리 수준에 따라 두 번째 프로세스가 첫 번째 업데이트로 선택된 행을 읽을 수 없도록 차단 읽기를 사용할 수 있습니다. –
@SergioMontoro 우리는 현재이 솔루션을 찾고 있습니다. 감사합니다! – user3334871