这或多或少是流动的吗?
CLIENT --> request-queue --> ESB --> service-queue --> SERVICE
then
SERVICE --> response-queue --> ESB --> tmp-queue --> CLIENT
我提议:
- 客户端调用Session。创建临时队列。返回的临时队列可以在使用同一连接时重复使用,因此这将是每个连接一次操作。
- 客户端发送请求,通过调用Message将临时队列添加为回复目的地。setJMSReplyTo (tempTopic)。
- ESB 接收请求,执行其注册操作并将请求转发到 SERVICE,再次将消息上的 JMSReplyTo 设置到客户端的临时队列。
- 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 被认为是礼貌的事情,其中作为任意标头......不是那么多。