1

我正在尝试实现一个 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端点。

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

4

1 回答 1

1

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

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

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

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

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

于 2012-08-11T03:32:01.900 回答