【问题标题】:Setting replyTo to a TMP Queue将 replyTo 设置为 TMP 队列
【发布时间】:2013-02-15 05:28:34
【问题描述】:

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

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

【问题讨论】:

    标签: jms wso2esb


    【解决方案1】:

    这或多或少是流程?

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

    我建议:

    1. 客户端调用Session.createTemporaryQueue。返回的临时队列可以在使用同一连接时重复使用,因此这将是每个连接一次的操作。
    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 被认为是礼貌的事情,其中​​作为任意标头......不是那么多。

    【讨论】:

    • 服务无法配置为回复客户端的 TMP 队列,这两种原因都是您所说的,并且需要重新配置数千个服务......所以所有服务响应都必须返回到 ESB在 ESB 定义的回复队列上,然后关联回该客户端的 TMP 队列上的正确客户端。
    • 这是 UltraESB 的快照,但不能在 wxo2 上将 2 和 2 放在一起。使用 Ultra,他们有一个漂亮的缓存 API,我使用发送的消息 ID(发送到服务的消息的 ID)作为键和一个字符串数组,其中客户端的原始 messageID 和 ReplyTo 作为值对象。当我收到服务回复时,我获取它的原始 ID,进行缓存查找,提取缓存条目,将客户端消息 ID 放回 JMS 传输标头并将其发送到 replyTo 值(原始客户端 TMP 回复队列) .在那里像冠军一样工作,所以需要一个匹配的 wso2 机制
    • 听起来 UltraESB 创建了一些专门用来处理这个问题的东西?好吧,在没有其他任何东西的情况下,您始终可以创建自己的简单缓存。我会推荐一个支持软/弱引用或基于时间的过期的单例(没有意义在它变得无用之后长时间保留所有这些东西......)这些天我的这类事情是谷歌番石榴缓存:code.google.com/p/guava-libraries/wiki/CachesExplained
    • Ultra 的全局缓存设施是该产品的基础部分,但是是的,可能是专门为这种用例创建的。谢谢,做我自己的缓存似乎是正确的方法。希望 wso2 有一个我可以使用的全局缓存设施,只是缺少了一些东西,但猜不到。很惊讶其他人以前没有遇到过这个问题,没想到我们这么独特......
    • 再深入一点,看来我需要编写一个自定义axis2模块来执行我需要的缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2019-12-10
    • 2018-09-02
    • 2015-03-30
    • 2016-06-25
    相关资源
    最近更新 更多