使用JMS / WMQ可以实现同步消息传递?

时间:2011-02-17 16:08:05

标签: java jms messaging ibm-mq mq

假设有一个移动应用程序需要对来自服务器的某些数据进行同步请求/查询。该请求将首先托管JMS客户端,该请求将在外部队列(来自合作伙伴)上发布消息/请求。现在这里开始不清楚了。如何以同步方式从伙伴处获得回复。

  • 伙伴是否应该公开单独的队列供我订阅,然后我阻止移动请求,直到我从该单独的队列中收到响应消息?
  • JMS或专有WebSphere MQ接口是否支持同步消息传递?
  • 通过消息传递实现它的其他方法是什么?

谢谢

3 个答案:

答案 0 :(得分:4)

教科书模式如下:

  1. JMS应用程序接收来自移动设备的请求。
  2. JMS应用程序打开回复队列(可能是动态的)。
  3. JMS app准备一条请求消息,指定#2中的目的地作为JMSREplyTo目的地。
  4. JMS应用程序将同步点之外的请求发送给外部服务提供商。
  5. JMS应用程序侦听具有指定等待间隔的响应。如果它使用动态回复队列,则执行简单接收。如果多个实例正在侦听同一队列(更可能是使用外部服务),那么它将使用从send返回的JMSMessageID作为在receive上指定的JMSCorrelationID。
  6. JMS应用程序从外部服务接收响应。
  7. JMS应用程序回复移动设备。
  8. 请注意,对于WMQ,服务提供者的预期行为是将JMSMessageID从请求消息复制到响应的JMSCorrelationID。要求发送方生成JMSCorrelation ID并将其复制到响应的JMSCorrelationID是不常见的,但某些应用程序使用该行为。您需要了解服务提供商如何处理此问题,以确定请求者应用程序的正确行为。

    如果您正在使用完整的WMQ客户端安装,那么您将拥有完成大部分操作的示例代码。如果安装到默认位置,请查看...

    C:\Program Files\IBM\Websphere MQ\tools\jms\samples\simple\simpleRequestor.java

    ...或UNIX {Linux发行版的/var/mqm下的等效位置。这是安装完整客户端而不是简单地抓取jar文件的众多原因之一。如果您需要下载客户端,则会以SupportPac MQC7发送。

答案 1 :(得分:2)

“客户端”可以创建一个临时队列,并在请求中传递此名称。

“服务器”在已知队列上接收请求,但发送“replyTo”,其中包含由“client”指定的队列名称。

JMS为此目的有一个“replyTo”属性。

这样客户端只会看到针对它的消息。

答案 2 :(得分:0)

在我的头顶,我看到两种方式。

  1. 创建2个队列:传入和传出。客户端发送到传入队列并从传出队列接收消息。

  2. 您可以为两者使用相同的队列。只需为每条消息设置特殊属性,并使用选择器仅过滤相关消息。

  3. 您的服务器端应首先发送消息,然后调用receive方法(请参阅JMS javadoc)。此方法将被阻止,直到您收到消息或超时为止。使用这种方式并且不监听消息(侦听器用于异步。模式)非常重要。