假设有一个移动应用程序需要对来自服务器的某些数据进行同步请求/查询。该请求将首先到达托管的 JMS 客户端,该客户端将在外部队列(来自合作伙伴)上发布消息/请求。现在这里开始不清楚了。如何以同步方式从合作伙伴那里获得响应。
- 合作伙伴是否应该公开单独的队列供我订阅,然后我阻止移动请求,直到我从该单独的队列中获得响应消息?
- JMS 或专有的 WebSphere MQ 接口是否支持同步消息?
- 通过消息传递实现它的其他方法是什么?
谢谢
教科书式样如下:
请注意,对于 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交付。
“客户端”可以创建一个临时队列并在请求中传递它的名称。
“服务器”在已知队列上接收请求,但发送具有“客户端”指定的队列名称的“replyTo”。
为此,JMS 有一个“replyTo”属性。
这样,客户端只能看到针对它的消息。
在我的头顶上,我看到了两种方式。
创建 2 个队列:传入和传出。客户端发送到传入队列并从传出队列接收消息。
您可以为两者使用相同的队列。只需为每条消息设置特殊属性并使用选择器仅过滤相关消息。
您的服务器端应先发送消息,然后调用receive
方法(请参阅 JMS javadoc)。在您收到消息或超时到期之前,此方法将被阻止。使用这种方式而不是侦听消息对您来说很重要(侦听器用于异步模式)