3

私は最近 JMS の学習を開始し、これまでにいくつかの概念を理解しました。ただし、IBM MQ または任意のキュー プロバイダーがマルチスレッド アプリケーションからの要求をどのように処理するかを知りたいです。例えば

マルチスレッド化され、MQ を使用してメインフレーム ホストにメッセージを送信するように構成されているアプリケーションを考えてみましょう。このアプリケーションには、1 つの Put キューと Get キューが構成されています。ホストからデータを取得するために、10 個のリクエストが処理されているとします。キューは 1 つのみであるため、これら 10 個のメッセージすべてが同時にキューに配置されます。ホストはメッセージを処理し、応答をクライアント (アプリケーション) に送信します。返信メッセージが混同されず、すべてのスレッドが独自の正しい返信メッセージを取得するにはどうすればよいですか?

通信中に一部の ID が使用されますが、それは送信されたメッセージの特定のスレッドに固有のものですか? 新しい実行スレッドごとに JMS セッションを確立する必要がありますか? 10 個のリクエストすべてに使用される同じセッションは何ですか? この概念を詳細に説明する例やリンクを高く評価します。

4

1 に答える 1

3

JMS は、いくつかの機能でこれをサポートしています。

まず、JMSCorrelationId は、要求と応答を関連付けるために使用される JMS ヘッダーです。つまり、各メッセージには、グローバルに一意の (GUID) JMSMessageId が含まれています。メインフレーム アプリは、メッセージ ID を要求から応答メッセージの JMSCorrelationId に単純にコピーし、共有応答キューに送り返す必要があります。

したがって、次の方法でリクエストを送信するだけです。

(psuedo code - in one thread, do the following when you need to request data over JMS)
myMessage = session.createTextMessage("My nice request");
messageProducer.send(myMessage); // using some previously setup producer
// commit if needed

mc = session.createConsumer(queue,"JMSCorrelationId='"+myMessage.getMessageId()+"'");
responseMessage = mc.receive(TIMEOUT);
if( responseMessage != null){
  //got OUR response data
}
// close down consumer here.

複数のコンシューマー スレッド (またはアプリケーション) を許可する秘訣は、コンシューマーのセレクターです。JMS セレクターは、SQL または同様のクエリ言語のサブセットに似ています。この場合、JMSCorrelationId がリクエストの ID と同じであるメッセージを選択するだけで、しばらくしてから送信されます。

これは、固定の共有キューが 1 つあり、要求が要求されたのとまったく同じスレッドに返される必要があるという制約で実行できる唯一の「安全な」セットアップです。

JMS セレクターのオーバーヘッドを回避するために、応答に一時キューを使用することもできます。リクエストごとに 1 つの一時キューを使用すると、特定の応答をリッスンする他のスレッドがなくなります。パフォーマンスを向上させるもう 1 つのオプションは、アプリケーションをより非同期にすることです。JMS は実際にこれを促進し、リクエストを起動し、コンシューマー スレッドのプールが非同期応答を処理できるようにします。各スレッドは、データを処理してデータベース (または同様のもの) に格納する際に、すべての応答を同等に処理できます。この設計パラダイムがあなたのケースに当てはまるかどうかはわかりませんが、少なくとも知っておく必要があります。

于 2012-08-13T14:16:17.873 に答える