我正在尝试实现一个mina服务,其中对最终消息的响应应基于之前的消息。每条消息(标题(1),数据(n),结束(1))应该收到响应,但对“结束”消息的响应应该基于“标题”,以及收到的任何“数据”消息作为“结束”的消息。目前,我正在将消息路由到聚合器,该聚合器在找到特定相关ID的“标题”和“结束”消息时完成。不幸的是,响应是在消息发送到聚合器之前(或同时?)发送的,因此我无法访问聚合消息(其中包含构建正确响应所需的所有数据)建立响应。
有没有办法在不手动存储和访问累积数据的情况下执行此操作(即,无需重新实现camel的聚合器)?
编辑:
路线就像:
<camelContext>
<route>
<from uri="mina:..."/>
<process ref="messageProcessor"/>
<aggregate>
<process ref="completeMessageProcessor"/>
</aggregate>
</route>
</camelContext>
为了清楚起见,我遗漏了一些标签和属性(correlationExpression
,completionPredicate
,strategyRef
等。
邮件正在正确聚合,并且在“完成”(即聚合时)正在正确处理它们。但是,通过mina
端点发送回客户端的响应是messageProcessor
生成的响应,而不是completeMessageProcessor
生成的响应。
例如(是的,这是一个相当人为的例子,但请耐心等待),假设协议涉及客户端发送标题消息,其中包含预期发送的数据消息总数。然后它发送许多数据消息,这些消息的数量可能与预期发送的数据不同。最后,它发送一个页脚或结束消息。然后,服务器应该回复预期的消息数和实际消息数之间的差异。由于写入了路由,这是不可能的,因为messageProcessor
不知道消息的数量,completeMessageProcessor
只处理单个消息。 mina
具有聚合消息(由标题,所有数据和结尾组成)确实知道此数字,但此时生成的响应不会传播回{ {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”交换