在Camel中聚合多个请求后响应MINA请求

时间:2012-08-06 22:33:45

标签: apache-camel apache-mina

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

有没有办法在不手动存储和访问累积数据的情况下执行此操作(即,无需重新实现camel的聚合器)?

编辑:

路线就像:

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

为了清楚起见,我遗漏了一些标签和属性(correlationExpressioncompletionPredicatestrategyRef等。

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

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

仅在收到整个撰写邮件时更改邮件解析以生成邮件不是一种选择,因为服务器必须响应各个邮件。

1 个答案:

答案 0 :(得分:1)

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

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

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

有关详情,请参阅此处:http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html

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