2012-01-16 5 views
1

私はmessageIdについてのWebsphere MQ上の2つの一般的な質問があります。のWebsphere MQメッセージ

1)このフィールドは、キュー内の同期通信を実現するために使用することができますか?以下のソースコードの例では :検索されたメッセージはhello_worldメッセージのみ、このメッセージの正確な応答であろう

MQMessage hello_world = new MQMessage(); 
hello_world.writeUTF("Hello World!"); 
MQPutMessageOptions pmo = new MQPutMessageOptions();  
system_default_local_queue.put(hello_world,pmo); 
MQMessage retrievedMessage = new MQMessage(); 
retrievedMessage.messageId = hello_world.messageId; 
MQGetMessageOptions gmo = new MQGetMessageOptions(); 
system_default_local_queue.get(retrievedMessage, gmo); 

は、より熟成がある場合でも、キュー内の他のすべてのメッセージを残す検索しますこの?

2)これが当てはまる場合、これは2つのキューで行うことができますか? 例: クライアント側:

MQMessage hello_world = new MQMessage(); 
hello_world.writeUTF("Hello World!"); 
MQPutMessageOptions pmo = new MQPutMessageOptions();  
input_queue.put(hello_world,pmo); 
MQMessage retrievedMessage = new MQMessage(); 
retrievedMessage.messageId = hello_world.messageId; 
MQGetMessageOptions gmo = new MQGetMessageOptions(); 
output_queue.get(retrievedMessage, gmo); 

サーバーサイド:

while(true){ 
MQMessage inMessage= new MQMessage(); 
input_queue.get(mqMessage ,gmo); 
//actions to get the contents of the inMessage and create proper response 
    MQMessage outMessage= new MQMessage(); 
//write the proper response to outMessage 
outMessage.messageId = inMessage.messageId; 
output_queue.put(outMessage, pmo); 
} 
+0

デフォルトでは、Mq_queueは非同期として指定されています。一方の側では、producer - > channel - > consumerです.2つの別々のチャネルput_channelとget_channelを作成しても、 →非同期 – mKorbel

答えて

2

私はあなたが間違った道を "同期" を使用していると思います。上記の#1で説明した内容は真です。つまり、MsgIDによるGETは、その1つのメッセージだけを取得します。ただし、これは同期メッセージングの例ではありません。

あなたが概説したクライアント/サーバー交換の一般的なケースは正しいです。多くのアプリケーションインスタンスが常にIDでメッセージを探す場合、同じ応答キューを使用できるのは一般的なパターンです。通常は、retrievedMessageオブジェクトのmsgIDを初期化する代わりに、correlIDが初期化されると予想されるため、MsgIDは相関IDにコピーされます。もちろん、その振舞いはサーバーアプリケーションの振る舞いに完全に依存しており、あるものはmsgIDという応答をmsgIDにコピーしています。

msgIDまたはcorrelIDのGETには、到着が遅いメッセージがどこかにあるように待機が含まれていることを確認してください。また、このパターンでは、1時間または2時間など、いくつかの時間枠内で取り上げられないと応答が期限切れになることが一般的です。

関連する問題