現在、私はSpring Webアプリケーションの背後で実行されるスケジュールされたタスクに取り組んでいます。このタスクでは、cronスケジューラを使用して毎晩真夜中に実行し、未使用のアプリケーションを自分のポータルでクリーンアップします(私のサイトでは、ユーザーが記入するアプリケーションを作成でき、30日以内にフォームにアクセスしないと、タスクはDBから削除し、必要に応じて電子メールで新しいフォームを作成するようにユーザーに通知します)。テスト環境ではすべてがうまく動作し、QAに移行する準備は整っています。負荷分散されたサーバー環境の2つの電子メールの送信をブロックする
しかし、私の次の環境では、2つの負荷分散されたサーバーを使用して要求を処理しています。これは、cronスケジューラーと私のポーリングタスクが両方のサーバーで同時に実行されるため、問題です。 DBへの読み書きは問題ではありませんが、問題はアプリケーションのユーザに通知メールを送信することにあります。ポーリングロックがなければ、2つの電子メールが生成されて送信される可能性があり、これを避けたいと思います。通常は、SQLストアドプロシージャを使用し、DBにロック用のフィールドを設定し、ポーリングコードが呼び出されるたびにset/releaseするため、ポーリングのインスタンスが1つだけ実行されます。しかし、私の新しいポーリング作業では、利用可能なフィールドがないため、私は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
}
としてそれを使用して考えていた:私は、このリソースをオンラインを発見しました2番目のインスタンスをスキップし、実行されません。あるいは、この解決策は適切ではないし、よりよい解決策がある。再び、私はSpringのJavaフレームワークを使用していますので、そこに存在するすべてのソリューションが私の最高の賭けになるでしょう。
セマフォは、異なるマシン上のプロセス間ではないスレッド間で同期します。データベースとトランザクションの分離レベルによっては、ブロッキング読み取りを使用して、2番目のプロセスが最初に更新用に選択された行を読み取れないようにすることができます。 –
@SergioMontoro私たちは現在このソリューションを探しています。ありがとう! – user3334871