如何使用请求 - 应答模式实现JMS路由器

时间:2013-01-08 01:19:35

标签: request jms router correlation reply

我有几个需要使用JMS相互通信的应用程序。我将它们描述为服务器和客户端。执行以下步骤:

  1. 客户端向服务器发送记住消息ID的请求。
  2. 服务器向给定的回复地址发送回复(并根据请求的消息ID设置相关ID)。
  3. 客户端使用相关ID将回复与请求进行匹配。
  4. 如果它只是那两个,这个工作正常。

    当我们介绍(基于内容的)路由器时,执行以下步骤:

    1. 客户端向路由器发送记住消息ID的请求。
    2. 路由器检查邮件的内容并将邮件转发给服务器。 (转发消息ID时更改。)
    3. 服务器向给定的回复地址发送回复(并根据请求的消息ID设置相关ID)。
    4. 客户端匹配对请求的回复,因为路由器更改了邮件ID。
    5. 我无法终身了解如何在符合JMS规范的情况下正确实现路由器。

      我已经提出以下内容但不知道这是否是最佳做法:

      1. 客户端向路由器发送记住消息ID的请求。
      2. 路由器会检查邮件的内容。
      3. 路由器会记住原始邮件,并向服务器发送新邮件(将回复地址设置为路由器的回复频道)。
      4. 服务器向给定的回复地址发送回复(并根据新请求的消息ID设置相关ID)。
      5. 路由器将回复与路由器发出的请求进行匹配。
      6. 路由器根据服务器的回复创建回复,将相关ID设置为原始邮件的邮件ID。
      7. 客户端将路由器对原始请求的回复进行匹配。
      8. JMS路由器如何工作/我的设计是否正确?

2 个答案:

答案 0 :(得分:0)

当您拥有基于内容的路由器时,事情不起作用的原因是基于内容的路由器正在创建具有新消息ID的新消息对象,并且它没有从原始消息设置的相关ID


以下是我过去的做法。假设您有以下队列。

  • 频道A - 客户端在此处提出请求
  • 频道S - 服务器获取请求

    1. 客户端在通道A上放置请求并设置客户端特定的相关ID并回复队列
    2. 路由器消耗A上的消息,向S创建一条消息,其中设置了相关ID,并且回复队列集
    3. 服务器使用客户端关联ID
    4. 回复对队列的回复

因此路由器根本不应该参与响应消息处理。说过这里是实现这种模式的一些常见错误。

  • 服务器不会在它生成的响应消息中设置相关ID,因为最终消费者会看到对队列的回复而忽略相关ID。
  • 消息队列有配置错误

答案 1 :(得分:0)

我正在寻找一个更权威的答案,可能包含对官方文档的引用,所以我做了更多的研究,这是我能找到的最好的:

在引用的文档中,描述了两种模式:

消息ID模式

  1. 客户端在请求中设置回复地址并将其发送到服务器。
  2. 服务器复制请求的消息ID,将其设置为回复的相关ID,并将回复发送到请求的回复地址。
  3. 相关ID模式

    1. 客户端在请求中设置相关ID并将其发送到服务器。
    2. 服务器将请求的预设相关ID复制为回复的相关ID,并将回复发送到预定义的队列。
    3. 下图提供了实现消息ID模式并将路由器实现为代理的想法:

      Message ID Pattern Example

      简而言之,我已经完成了我最初的想法。

      来源:http://docs.oracle.com/cd/E13171_01/alsb/docs25/interopjms/MsgIDPatternforJMS.html