【问题标题】:Respond to MINA request after aggregating several requests in Camel在 Camel 中聚合多个请求后响应 MINA 请求
【发布时间】:2012-08-06 22:33:44
【问题描述】:

我正在尝试实现一个 mina 服务,其中对最终消息的响应应该基于以前的消息。每条消息(header (1), data (n), end (1))都应该收到一个响应,但是对“end”消息的响应应该基于“header”,并且接收到的任何“data”消息也是如此作为“结束”消息。目前,我正在将消息路由到一个聚合器,该聚合器在找到特定关联 ID 的“标题”和“结束”消息时完成。不幸的是,响应是在消息发送到聚合器之前(或同时?)发送的,因此我无法访问聚合消息(其中包含构建正确响应所需的所有数据)时构建响应。

有没有办法做到这一点,而无需手动存储和访问累积的数据(即无需重新实现骆驼的聚合器)?

编辑:

路线类似于:

<camelContext>
    <route>
        <from uri="mina:..."/>
        <process ref="messageProcessor"/>
        <aggregate>
            <process ref="completeMessageProcessor"/>
        </aggregate>
    </route>
</camelContext>

为了清楚起见,我省略了一些标签和属性(correlationExpressioncompletionPredicatestrategyRef 等)。

消息被正确聚合,并且在“完成”(即聚合时)时被正确处理。但是通过mina 端点发送回客户端的响应是messageProcessor 生成的响应,而不是completeMessageProcessor 生成的响应。

例如(是的,这是一个相当人为的示例,但请耐心等待),假设该协议涉及客户端发送一个标头消息,其中包括它期望发送的数据消息的总数。然后它发送一些数据消息,这些数据消息的数量可能与它预期发送的不同。最后,它发送一个页脚或结束消息。然后,服务器应以预期消息数与实际消息数之间的差异进行响应。使用所写的路由,这是不可能的,因为messageProcessor 不知道消息的数量,它只处理单个消息。 completeMessageProcessor,具有聚合消息(包括标头、所有数据和结尾)确实知道这个数字,但此时生成的响应不会传播回 mina端点。

更改消息的解析以仅在收到完整的组合消息时生成消息不是一种选择,因为服务器必须响应单个消息。

【问题讨论】:

  • 发布您的路线...不确定您的意思是“在消息发送到聚合器之前(或同时?)发送响应...”

标签: apache-camel apache-mina


【解决方案1】:

在顶部,我的猜测是messageProcessor 正在设置 OUT 消息,但 completeMessageProcessor 正在设置 IN 消息。 mina 消费者响应期待/使用 OUT 消息。

您可以添加一些logging 来验证这一点。如果是这种情况,那么您可以更改您的 messageProcessor 以使用 IN 正文(或使用交换标头)并在您的 completeMessageProcessor 之后添加一个转换以根据 IN 正文设置 OUT 正文

<transform>
  <simple>${in.body}</simple>
</transform>

更多信息请参见:http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html

更新:经过一番讨论,真正的问题是聚合器目前只处理“InOnly”交换

【讨论】:

  • 就是这样。谢谢!如果没有设置 OUT 消息,我会不知不觉地依赖骆驼默认的传播 IN 消息,并且被 &lt;bean...&gt; 处理设置 OUT 消息的事实绊倒(而不是退回到传播 IN 消息)。所以我在聚合器之前使用的&lt;bean...&gt; 标签正确设置了 OUT 消息,这就是为什么我在那里得到响应,但在聚合器之后没有。
  • 太棒了...很高兴我能帮上忙...我已经做过很多次了
  • 人力资源部。显然我弄错了,它不起作用。发回的响应仍然是messageProcessor 中计算的响应,而不是completeMessageProcessor 中的响应,即使我在那里明确设置了 OUT 消息正文。实际上,如果我没有在messageProcessor 中设置OUT 消息,则返回的响应是null
  • 经过进一步调查后,AggregationStrategy 似乎没有收到原始 Exchange,而是收到了一份副本。我可以通过检查各个点的交换 ID 来验证这一点。在整个链中,直到聚合器之前,交换 ID 保持不变。但是,作为 newExchange 传递到 AggregationStrategy 的 Exchange 具有不同的 ID。鉴于此,发送回 mina 端点的响应不是聚合器生成的响应也就不足为奇了,因为那是在不同的 Exchange 上。看来我运气不好。 :(
  • 我明白你的意思,聚合器会创建一个新的 Exchange,用于下游端点,而不是作为响应。也就是说,我相信您可以使用内容丰富器模式以及单独的路由让您的聚合器用其结果装饰主要交换......
猜你喜欢
  • 2022-11-20
  • 2021-07-17
  • 1970-01-01
  • 2021-05-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2020-01-26
相关资源
最近更新 更多