2011-02-17 104 views
4

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

  • 如果合作伙伴揭露单独的队列为我订阅,然后我阻止移动请求,直到我从单独的队列得到的回应消息?
  • JMS或专有WebSphere MQ接口是否支持同步消息传递?
  • 什么是通过消息传递实现它的其他方法?

感谢

回答

4

教科书模式如下:

  1. JMS应用接收到来自移动设备的请求。
  2. JMS应用程序打开回复队列(可能是动态的)。
  3. JMS应用程序准备指定来自#2的目的地作为JMSREplyTo目的地的请求消息。
  4. JMS应用程序将同步点之外的请求发送到外部服务提供者。
  5. JMS应用程序侦听具有指定等待间隔的响应。如果它使用动态回复队列,它会进行简单的接收。如果多个实例正在同一个队列上侦听(这更可能用于外部服务),那么它会使用从send返回的JMSMessageID作为在接收端指定的JMSCorrelationID。
  6. JMS应用程序接收来自外部服务的响应。
  7. JMS应用程序回复移动设备。

请注意,对于WMQ,服务提供者的预期行为是将JMSMessageID从请求消息复制到响应的JMSCorrelationID。要求发送者生成JMSCorrelation ID并将其复制到响应的JMSCorrelationID中是不常见的,但是一些应用程序使用该行为。您需要了解您的服务提供商如何处理此问题,以确定请求者应用程序的正确行为。

如果您使用的是完整的WMQ客户端安装,您将已经拥有大部分代码。如果安装到默认位置,看在...

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

...或/var/mqm下的等价位置UNIX/Linux发行版。这是安装完整客户端而不是简单地抓取jar文件的诸多原因之一。如果您需要下载的客户端是交付为SupportPac MQC7

+0

感谢T.Rob, \ n 我们没有WMQ服务器。答复队列(从1开始)也可以是远程队列吗?这样我们就可以成为一个纯粹的客户端,并且不必托管服务器?或者你必须有本地回复队列? 此外,这种情况下工作在并发环境?就像数百个移动设备将通过相同的消费者发送消息并通过同一个听众接收响应一样。 – user567068 2011-02-18 03:11:50

0

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

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

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

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

2

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

“服务器”在已知队列上接收请求,但发送具有“客户机”指定的队列名称的“replyTo”。

JMS具有用于此目的的“replyTo”属性。

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