4

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

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

谢谢

4

3 回答 3

4

教科书式样如下:

  1. JMS 应用程序接收来自移动设备的请求。
  2. JMS 应用程序打开回复队列(可能是动态的)。
  3. JMS 应用程序准备一个请求消息,将 #2 中的目的地指定为 JMSREplyTo 目的地。
  4. JMS 应用程序将同步点之外的请求发送到外部服务提供者。
  5. JMS 应用程序以指定的等待间隔侦听响应。如果它使用动态回复队列,它会进行简单的接收。如果多个实例正在侦听同一个队列(更可能是使用外部服务),则它使用从发送返回的 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交付。

于 2011-02-17T20:23:52.153 回答
2

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

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

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

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

于 2011-02-17T17:23:00.913 回答
0

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

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

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

您的服务器端应先发送消息,然后调用receive方法(请参阅 JMS javadoc)。在您收到消息或超时到期之前,此方法将被阻止。使用这种方式而不是侦听消息对您来说很重要(侦听器用于异步模式)

于 2011-02-17T16:16:49.390 回答