2012-01-16 210 views
1

我已经关于messageId在WebSphere MQ两个一般性问题:的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

Mq_queue被指定为默认异步,在一侧是生产者 - >信道 - >消费者,如果创建了两个分离的通道put_channel和get_channel,但message_flow仍保持不变第二例子是舒适用于数据流 - - >异步 – mKorbel 2012-01-16 22:53:16

回答

2

我想您正在使用 “同步” 走错了路。你在上面#1中描述的是真的 - MsgID的GET将只检索那一条消息。但是,这不是一个同步消息传递示例。

你介绍的客户机/服务器交换的一般情况下是正确的。这是一种常见模式,如果许多应用程序实例总是通过ID查找消息,则它们可以使用相同的答复队列。通常情况下会发生什么情况是,msgid是复制到相关ID,但这样不是retrievedMessage对象初始化msgID的,一个希望看到correlID代替初始化。当然,该行为是完全依赖于服务器应用程序的行为,而有些则要求msgID复制到答复msgID

只要确保通过msgIDcorrelID的GET包括等待,这样一个迟到的消息有地方可去。同样,在这种模式下,如果答复在某个时间范围内没有收到 - 例如一两个小时,答复就会过期。