2017-06-21 5 views
0

私は非常に複雑なアプリケーションを持っています(警察や他の緊急センターコントローラが使用するコマンド/コントロールセンターのスプリング+角度ベースのアプリケーションです)。正しい方法での処理方法/スレッド

アプリケーションの主要コンポーネント(バックボーンと呼ばれる[spring web app])は、さまざまなアプリケーション/ハードウェアとの通信です。その通信の大部分は、RabbitMQメッセージ(テレグラムまたは短いTMで呼ぶことができます)を使用して行われます。

TMの1つがバックボーンによって受信されると、新しいスレッドが作成され、いくつかのメソッド/メソッドが実行されます。

問題は、バックボーンがほぼ同時に2つ以上のTMを受信し、異なるスレッドで実行されるため、到着した順序と同じ順序でフィニッシュされていない可能性があるユーザに提示される。

通常、このような問題は私がRedisで処理します。私は基本的にこの

distributedRedisLocker.lock(() -> { 
    executeSomeMethod(); 
}, howLongIsLockKept, howLongDoWeWaitForItToFinnish); 

のように見えますが、この場合には、私はRedisのを使用して避けたいRedisのロックを持っている、これに他のJava /春ベースのソリューションはありますか?

私はそれが私が持っているredisロックと同じである必要はありません、私が望むのは、それらが到着する順序でTMが処理され、それらのいずれかがメソッドの実行のどこかで失敗した場合、永遠に1つ。

+3

これらのTMを 'Executors.newSingleThreadExecutor()'のようなシングルスレッドエグゼキュータで処理する方法はありますか? –

+0

これは正しいことのように聞こえ、試して進捗状況を更新します。 – mirzak

答えて

1

回答として回答してください。

問題を解決する1つの方法は、並行性を避けることです。これは、あなたがレースを回避するのに役立つだろう

ExecutorService executor = Executors.newSingleThreadExecutor(); 

、その後

executor.execute(...); 

または

executor.submit(...); 

:いくつかのTM Aが実行キューに追加された場合にのみ、1つのスレッドを使用しますExecutors.newSingleThreadExecutor()を使用することができますTM Bの前にこの実行プログラムによって定義されている場合、Aは全体としてBの前に実行されます。

また、明示的なロックはありません(エグゼキュータ実装内に含めることができる暗黙のロックを除いてはカプセル化されており、エラーの場合は永久に渡されません)。

微妙な瞬間があります:2つのTMが同時に到着した場合、どのTMが先に追加されるのか、後にTMが追加されるのかを予測することは不可能です。

+0

私は、異なるタイプのTMを持っていればどうしたらいいのでしょうか?同時に2つのTMを取得しても、異なるタイプのTMを取得すると、すぐに実行され、最初のものを待つことはありません。それは働くだろうか? – mirzak

+0

異なるタイプのTMは互いに独立していますか?それらを同時に実行することができれば、TMタイプごとにシングルスレッドの実行プログラムを作成し、TMタイプで選択された実行プログラムでTMを実行することができます。 –

+0

はい、彼らは独立しています。それをやろうとします。私はそれについて考えていた、私はこれがJava同期ブロックを使用して行うことができると思う。 – mirzak

関連する問題