Websphere MQ消息

时间:2012-01-16 22:38:40

标签: java ibm-mq

关于messageId,我在Websphere MQ上有两个一般性问题:

1)该字段可用于实现队列中的同步通信吗? 例如,在以下源代码中:

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);

检索到的消息将是hello_world消息的确切响应,并且只检索到此消息,即使有更多的老化,也会将所有其他消息留在队列中?

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);
}

1 个答案:

答案 0 :(得分:2)

我认为你正在以错误的方式使用“同步”。您在上面#1中描述的内容是正确的 - MsgID的GET将仅检索该一条消息。但是,这不是同步消息传递示例。

您概述的客户端/服务器交换的一般情况是正确的。这是一种常见模式,如果许多应用程序实例始终按ID查找消息,则它们可以使用相同的应答队列。通常情况下,MsgID被复制到关联ID,但不是初始化msgID对象上的retrievedMessage,而是希望看到correlID初始化。当然,行为完全取决于服务器应用程序的行为,有些人会将请求msgID复制到回复msgID

只需确保msgIDcorrelID的GET包含等待,以便迟到的消息可以到达某个地方。此外,对于这种模式,如果在一段时间内(例如一两个小时)没有收到回复,则回复通常会过期。