关于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);
}
答案 0 :(得分:2)
我认为你正在以错误的方式使用“同步”。您在上面#1中描述的内容是正确的 - MsgID的GET
将仅检索该一条消息。但是,这不是同步消息传递示例。
您概述的客户端/服务器交换的一般情况是正确的。这是一种常见模式,如果许多应用程序实例始终按ID查找消息,则它们可以使用相同的应答队列。通常情况下,MsgID被复制到关联ID,但不是初始化msgID
对象上的retrievedMessage
,而是希望看到correlID
初始化。当然,行为完全取决于服务器应用程序的行为,有些人会将请求msgID
复制到回复msgID
。
只需确保msgID
或correlID
的GET包含等待,以便迟到的消息可以到达某个地方。此外,对于这种模式,如果在一段时间内(例如一两个小时)没有收到回复,则回复通常会过期。