【发布时间】: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>
为了清楚起见,我省略了一些标签和属性(correlationExpression、completionPredicate、strategyRef 等)。
消息被正确聚合,并且在“完成”(即聚合时)时被正确处理。但是通过mina 端点发送回客户端的响应是messageProcessor 生成的响应,而不是completeMessageProcessor 生成的响应。
例如(是的,这是一个相当人为的示例,但请耐心等待),假设该协议涉及客户端发送一个标头消息,其中包括它期望发送的数据消息的总数。然后它发送一些数据消息,这些数据消息的数量可能与它预期发送的不同。最后,它发送一个页脚或结束消息。然后,服务器应以预期消息数与实际消息数之间的差异进行响应。使用所写的路由,这是不可能的,因为messageProcessor 不知道消息的数量,它只处理单个消息。 completeMessageProcessor,具有聚合消息(包括标头、所有数据和结尾)确实知道这个数字,但此时生成的响应不会传播回 mina端点。
更改消息的解析以仅在收到完整的组合消息时生成消息不是一种选择,因为服务器必须响应单个消息。
【问题讨论】:
-
发布您的路线...不确定您的意思是“在消息发送到聚合器之前(或同时?)发送响应...”