将replyTo设置为TMP队列

时间:2013-02-14 20:28:19

标签: jms wso2esb

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

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

1 个答案:

答案 0 :(得分:0)

这或多或少是流量吗?

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

我建议:

  1. 客户致电SessioncreateTemporaryQueue。返回的临时队列可以在使用相同的连接时重复使用,因此这将是每个连接操作一次。
  2. 客户端通过调用Message发送请求,将临时队列添加为回复目标。setJMSReplyTo(tempTopic)。
  3. ESB接收请求,执行其注册表事务并将请求转发给SERVICE,再次将消息上的JMSReplyTo设置为客户端的临时队列。
  4. SERVICE执行其操作并将响应直接发送到消息JMSReplyToHeader中的目标。 (响应必须通过ESB返回的任何具体原因?)
  5. 所以流程实际上是:

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

    有两个我可以想到的陷阱(并且按下了,我相信我能想出更多......)

    • SERVICE正在另一个代理上运行,无法直接发送到客户端的临时队列。

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

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