0

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

  1. 客户端向服务器发送一个请求,记住消息 ID。
  2. 服务器向给定的回复地址发送回复(并且还根据请求的消息 ID 设置相关 ID)。
  3. 客户端使用相关 ID 匹配对请求的回复。

如果只有这两个,这很好用。

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

  1. 客户端向路由器发送一个请求,记住消息 ID。
  2. Router检查消息的内容并将消息转发给Server。(转发消息 ID 更改时。)
  3. 服务器向给定的回复地址发送回复(并且还根据请求的消息 ID 设置相关 ID)。
  4. 客户端与请求的回复不匹配,因为路由器更改了消息 ID。

我终其一生都无法弄清楚如何在符合 JMS 规范的同时正确实现路由器。

我想出了以下内容,但不知道这是否是最佳做法:

  1. 客户端向路由器发送一个请求,记住消息 ID。
  2. 路由器检查消息的内容。
  3. 路由器记住原始消息并向服务器发送新消息(将回复地址设置为路由器的回复通道)。
  4. 服务器向给定的回复地址发送回复(并且还根据新请求的消息 ID 设置相关 ID)。
  5. 路由器将回复与路由器发出的请求相匹配。
  6. Router根据Server的回复创建回复,将关联ID设置为原始消息的消息ID。
  7. 客户端匹配路由器对原始请求的回复。

JMS 路由器应该如何工作/我的设计是否正确?

4

2 回答 2

0

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


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

  • 通道 A - 客户在这里提出请求
  • 通道 S - 服务器在此处获取请求

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

所以路由器根本不应该参与响应消息的处理。话虽如此,这里是实现此模式的一些常见错误。

  • 服务器不会在它生成的响应消息中设置关联 id,因为最终消费者看到了对队列的回复,而只是忽略了关联 id。
  • 消息队列有配置错误
于 2013-01-08T05:21:06.283 回答
0

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

在参考文档中描述了两种模式:

消息 ID 模式

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

相关 ID 模式

  1. 客户端在请求中设置一个关联 ID 并将其发送到服务器。
  2. 服务器将预先设定的请求关联标识复制为回复的关联标识,并将回复发送到预定义的队列中。

下图给了我实现消息 ID 模式并将路由器实现为代理的想法:

消息 ID 模式示例

所以简而言之,我已经接受了我最初的想法。

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

于 2013-01-11T22:12:50.973 回答