2012-05-10 11 views
0

JMSには、キューとトピックがあります。これまでのところ、キューはプロデューサ/コンシューマのシナリオで最もよく使用されています。トピックはパブリッシュ/サブスクライブに使用できます。しかし私のシナリオでは、両方のアプローチを組み合わせて、プロデューサー - コンシューマーオブザーバーアーキテクチャーを作成する方法が必要です。JMSプロデューサ/コンシューマオブザーバ(PCO)

特に、私はいくつかのキューとワーカーに書き込むプロデューサを持っています。これらのキューから読み込んでそれらのキュー内のメッセージを処理し、別のキュー(またはトピック)に書き込みます。作業者が仕事をしたときはいつでも、私のGUIに通知し、現在のシステム状態の表現を更新する必要があります。ワーカーとGUIは異なるプロセスなので、単純なオブザーバーパターンを適用したり、GUIに直接通知することはできません。

キューやトピックの組み合わせを使用してこれを実現するにはどうすればよいでしょうか? GUIは常に通知されるべきですが、キューから何も消費するべきではありませんか?

これをJMSで直接解決したいと思います。オブザーバ部分を実装するためにRMIなどの追加技術を使用しないでください。より具体的な例与えること

:私はマシン(PackageProducer)によって生成パッケージ(PACKAGEQUEUE)でキューを、持っている

  1. 私はPACKAGEQUEUEからパッケージを取る労働者がアドレスを追加する必要がありMAILQUEUEAddressWorker
  2. に書き込みます。別のワーカーはMAILQUEUEを処理し、パッケージをメール(MailWorker)で送信します。
  3. ステップ2.メッセージがMAILQUEUEに書き込まれたときに、GUIに通知してパッケージのステータスを更新する必要があります。もちろん、GUIはMAILQUEUEのメッセージを消費すべきではなく、MailWorkerだけを消費しなければなりません。

答えて

1

ソリューションにキューとトピックの組み合わせを使用できます。

あなたのGUIアプリケーションは、たとえばMAILQUEUE_NOTIFICATIONのトピックに登録できます。毎回(ステップ2)PackageProducerはメッセージをMAILQUEUEに書き込みます。そのメッセージのコピーはMAILQUEUE_NOTIFICATIONトピックに公開する必要があります。 GUIアプリケーションはトピックにサブスクライブしているので、パッケージのステータスに関する情報を含むパブリケーションを取得します。 GUIは、そのパブリケーションの内容で更新することができます。

HTH

+0

おかげで、もう一つ質問:それはキューとトピックの組み合わせを使用する必要が常にまたは私は、たとえば 'MAILTOPIC'に' MAILQUEUE'を変更して、GUIとMailWorkerの両方を購読することができます?現時点で私が見ていない影響はありますか? – lanoxx

+0

不要です。キューではなくトピックを使用することができ、GUIとMailWorkerの両方がそのトピックにサブスクライブします。あなたのソリューションでは、MailWorkerはメッセージを処理し、GUIはメッセージを表示します。 MailWorkerは、実行中でなくてもパブリケーションを見逃してはならないので、永続的なサブスクリプションを作成する必要があります。 GUIでは、サブスクリプションのタイプを選択できます。 – Shashi

+0

私が見ているように、キャッチは、GUIとワーカーの両方を単一のトピックに登録し、そのうちの1つが実行されていないとメッセージが失われることです。トピックとキューは別々ですが、これは起こりません。右? – lanoxx