【问题标题】:Synchronous messaging possible with JMS/WMQ?可以使用 JMS/WMQ 进行同步消息传递吗?
【发布时间】:2011-06-29 05:20:59
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java jms messaging ibm-mq mq


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      这样客户端只能看到发给它的消息。

      【讨论】:

        【解决方案3】:

        教科书式样如下:

        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

        【讨论】:

        • 谢谢 T.Rob,\n 我们没有 WMQ 服务器。回复队列(从 1.开始)也可以是远程队列吗?这样我们就可以成为纯粹的客户端并且不必托管服务器?或者你必须在本地有回复队列?此外,这种情况是否可以在并发环境中工作?就像数百个移动设备将通过同一个消费者发送消息并通过同一个侦听器接收响应一样。
        • 天啊!我误解了这个问题。让我重新写答案。
        • 谢谢 T.Rob。你说的超级清楚!您能否告诉我,对于来自移动设备的每个请求,我是否需要执行 SimpleRequestor.java 中的所有步骤(例如创建连接工厂、获取连接、打开队列、创建临时队列等)。或者我应该创建连接工厂、连接和目标。只排队一次?但创造温度。每个请求的(回复)队列?还有温度。 queue 是在本地创建的吗?而且不需要托管服务器,对吧?
        • 通常情况下,应用程序会为每个线程打开一个连接并循环执行上述步骤。请注意,事务的范围是每个连接,因此这通常意味着每个线程都有一个连接。使用外部服务时,他们会告诉您是否支持动态队列。在您的应用程序连接到的 QMgr 上创建一个动态队列。外部服务允许客户端连接而不是让您运行自己的 QMgr 实际上有点不寻常,但决定权取决于他们。 WMQ 支持任一模型。
        猜你喜欢
        • 2018-02-10
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 2011-02-26
        • 2011-01-29
        • 2011-12-29
        • 2016-02-23
        • 1970-01-01
        相关资源
        最近更新 更多