7

システムの最後の部分を設計する方法を理解するのに苦労しています。現在、クライアントの要求に応答するサーブレットを備えたTomcatサーバーを実行しています。各リクエストは、非同期キューに処理メッセージを追加します(おそらく、SpringまたはAmazon SQS経由でJMSを使用します)。

イベントのシーケンスは次のとおりです。

送信側:
1。クライアント要求を受け取ります
2.この要求に関連するデータを一意のIDでDBに
追加します3.この要求を表すメッセージオブジェクトをメッセージキューに追加します

受信側:
1。キューから新しいメッセージオブジェクトをプルします
。2。オブジェクトをアンラップし、msgオブジェクトに含まれている情報に基づいてWebサイトからいくつかの情報を取得します。
3.電子メールアラートを送信します
。4。このリクエストの操作が完了したという情報でDB行(同じ一意のID)を更新します。

受信側を適切に処理する方法を理解するのに苦労しています。一方では、キュー内の各アイテムを選択して処理するコマンドラインから開始する単純なJavaプログラムを作成できる可能性があります。安全ですか?そのプログラムをTomcatコンテナ内の別のスレッドとして実行する方が理にかなっていますか?これを連続して実行したくはありません。つまり、受信側は、複数のスレッドを使用して、一度に複数のオブジェクトを処理できる必要があります。私はこれを24時間常に実行したいと思っています。

受信側を構築するためのいくつかのオプションは何ですか?

4

4 に答える 4

3

「一方で、キュー内の各項目を選択して処理するコマンド ラインから起動する単純な Java プログラムをおそらく作成できます。それは安全ですか?」

それについて何が危険ですか?それはうまくいきます。

「そのプログラムを Tomcat コンテナー内の別のスレッドとして実行する方が理にかなっていますか?」

Tomcat がバックグラウンド処理を処理するための十分な空き時間を持っている場合のみ。多くの場合、これ当てはまります。この種の処理を行う自由な時間があります。

ただし、スレッドは最適ではありません。スレッドは共通の I/O リソースを共有し、バックグラウンド スレッドがフロントエンドの速度を低下させる可能性があります。

「ポート 80」フロントエンドと別のバックエンド プロセスの間に JMS キューを配置することをお勧めします。バックエンド プロセスが開始され、キューに接続され、要求がフェッチされて実行されます。バックエンド プロセスは (必要に応じて) マルチスレッドにすることができます。

于 2009-02-05T02:43:24.790 に答える
3

JMS を使用している場合、なぜタスクを DB に配置するのですか?

JMS で永続キューを使用できます。これにより、JMS ブローカが停止した場合でも、確認されるまでタスクが保持されます。冗長ブローカーを使用して、1 つのブローカーが停止した場合に 2 番目のブローカーが自動的に引き継ぐことができます。これは、単一の DB を使用するよりも信頼性が高くなる可能性があります。

于 2009-02-05T02:45:43.363 に答える
1

すでに Spring を使用している場合は、DefaultMessageListenerContainerを確認してください。POJO メッセージ駆動型 Bean を作成できます。これは、既存のアプリケーション コンテナー (WAR ファイル) 内から、または別のプロセスとして使用できます。

于 2009-02-05T02:42:00.593 に答える
0

私はアプリサーバー、私の場合は weblogic でレシーバーをホストすることでこの種のことを行いましたが、Tomcat も正常に動作します。キューをポーリングせず、イベントベースのモデルを使用してください。これは手作業でコーディングすることも、メッセージ駆動型の Web サービスにすることもできます。データベースの更新がべき等である場合、データベースを更新して電子メールを送信し、キューでコミットを発行できます。複数のスレッドがすべて同じキューから読み取ることは問題ではありません。

私は、tibco、activemq (Apache に組み込まれる前)、joram など、さまざまな JMS ソリューションを使用してきました。Joram はより信頼性の高いオープンソース ソリューションでしたが、Apache の一部になった今では変わっている可能性があります。

于 2009-02-05T02:41:31.313 に答える