0

通过 ESB 仅执行基于 JMS 的消息传递。ESB 有一个专用的 REQUEST 队列,客户端在其中使用 SOAP 包装器发送服务请求。Wrapper 被解释为服务名称和版本、注册表查找、服务 QUEUE 的路由。服务在专用 ESB REPLY 队列上响应 ESB。然后需要关联以更正存储的请求,以在其 TMP 队列上将回复发送回客户端。我不知道如何使用服务 Sent Msg ID 作为键将原始 JMS 请求的 TMP 队列保存到某种缓存中,以便我可以检索原始请求消息 ID 和 TMP QUEUE?

所以两个问题。如何访问代理配置中的 jms msg 标头。如何设置某种缓存或存储用于响应的数据以将它们关联回请求并设置回复。文档中根本没有纯 JMS 示例。

4

1 回答 1

0

这或多或少是流动的吗?

CLIENT --> request-queue --> ESB --> service-queue --> SERVICE
then
SERVICE --> response-queue --> ESB --> tmp-queue --> CLIENT

我提议:

  1. 客户端调用Session创建临时队列。返回的临时队列可以在使用同一连接时重复使用,因此这将是每个连接一次操作。
  2. 客户端发送请求,通过调用Message将临时队列添加为回复目的地。setJMSReplyTo (tempTopic)。
  3. ESB 接收请求,执行其注册操作并将请求转发到 SERVICE,再次将消息上的 JMSReplyTo 设置到客户端的临时队列。
  4. SERVICE 完成它的工作并将响应直接发送到消息 JMSReplyToHeader 中的目的地。(响应必须通过 ESB 返回的任何具体原因?)

所以流程实际上是:

CLIENT --> request-queue --> ESB --> service-queue --> SERVICE
then
SERVICE --> tmp-queue --> CLIENT

我可以立即想到 2 个陷阱(并且按下,我相信我可以想出更多....)

  • SERVICE 在不同的代理上运行,不能直接发送到客户端的临时队列。

在这种情况下,让 ESB 维护以消息 ID 为键的客户端临时队列缓存。当 ESB 向服务发送请求时,将 JMSCorrelationId 标头设置为从客户端接收到的消息的 message-id。SERVICE 应该从它接收到的消息中读取 JMSCorrelationId,并将它添加到它发送回 ESB 的响应消息中。(还感到困惑吗?)现在 ESB 接收到来自 SERVICE 的响应,解包 JMSCorrelationId,查找相应的临时队列并在其上发送响应。

如果您的 CLIENT 始终可以提供唯一的客户端 ID,则不是通过 messageId 缓存临时队列,而是可以通过它来缓存临时队列(粒度较小)。您与 SERVICE 的合同从 JMSCorrelationId 切换到 client-id。不过,根据我的经验,对于请求-响应 JMS 服务来说,始终返回提供的相关 ID 被认为是礼貌的事情,其中​​作为任意标头......不是那么多。

于 2013-02-14T21:28:34.053 回答