非常に単純な非同期処理の要件については、java.util.concurrentパッケージの任意の適切なクラスを使用できます。
システム障害(ソフトウェアまたはハードウェアクラッシュ)が発生した場合でもジョブを正常に完了しなければならない、またはジョブ処理を別のプロセスにオフロードしたいという保証が必要な場合は、 。
JMSアプローチは、比較的簡単な労力で非常に洗練されたソリューションを提供できます。
メッセージング(JMS)は、非同期ジョブのサブミットを維持し、実際の処理から切り離されたタスクの提出を維持するという問題を解決できる非常に標準的な統合ソリューションです。メッセージベースのソリューションは、ジョブキューで待機している「ジョブプロセッサ」スレッドの数を増やすことによって簡単に拡大縮小できます。トラフィックは自動的に負荷分散されます。また、メッセージ処理システムは、ジョブの処理が失敗して再試行できるようになった場合に、自動的にメッセージをキューに戻すトランザクションサポートを提供することもできる。
多くのエンタープライズ統合パターンは、メッセージングシステム(メッセージ指向のミドルウェア)に基づいています。 Enterprise Integration Patterns by Gregor Hohpeのこの本には、アプリケーションでメッセージングを使用する方法の最も一般的なパターンがあります。ジョブ処理がいずれかのジョブの行ステータスを更新最終的に処理アプリケーションによって開始したとき
データベースアプローチは、「新しい仕事」のためのテーブルをポーリング行のステータスを更新
1)に他の処理を必要と(または、テーブルからジョブを完全に削除する)ことができます。 2)ジョブ処理中に何か問題が発生した場合は、ジョブのステータスをテーブル上の「新規」に戻して、ポーリング・メカニズムがジョブを再開できるようにします。また、システムの起動時に「回復スレッド」を書き込んで、矛盾した状態になっているジョブを見つけ出し、「新しい」状態に戻して処理を再開する必要が生じます。
要するに、データベースに基づいた統合ソリューションを構築するには多くの労力が必要です。また、「ジョブ・サブミッター」アプリケーションと「ジョブ・プロセッサー」アプリケーションの両方を、データベースのカプセル化を破るデータベース・スキーマと緊密に結合します。あなたの 'ジョブプロセッサー'が複数のスレッドを持っている場合は(スケーリングしたい場合はおそらく必要になります)、1つのスレッドだけがそのジョブを取り出し、 'その行'を更新するようにする必要があります。
JMSソリューションは、このロジックを手作業でコーディングすることなくこの問題を非常に簡単に解決します。
確かに、あなたがキューを使用しているなら、あなたはうんざりしていません。しかし、メッセージングミドルウェアを導入するには、有効なユースケースが必要です。
このアプローチは、JMSよりも簡単には聞こえません。 –
@kaleb、hmmおそらく。 JMSのアプローチのすべての部分を別のものと並べて配置することは価値があるかもしれません。 – hvgotcodes
JMSのような依存関係は、どこかでテーブル – ChrisBlom