Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 在Camel中聚合多个请求后响应MINA请求_Apache Camel_Apache Mina - Fatal编程技术网

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

Apache camel 在Camel中聚合多个请求后响应MINA请求,apache-camel,apache-mina,Apache Camel,Apache Mina,我正在尝试实现一个mina服务,其中对最终消息的响应应该基于前面的消息。每个消息(报头(1)、数据(n)、结束(1))都应收到一个响应,但对“结束”消息的响应应基于“报头”、收到的任何“数据”消息以及“结束”消息。目前,我正在将消息路由到聚合器,该聚合器在找到特定关联id的“header”和“end”消息时完成。不幸的是,响应是在消息发送到聚合器之前(或同时?)发送的,因此我无法访问聚合消息(其中包含生成正确响应所需的所有数据)生成响应时 有没有一种方法可以做到这一点,而无需手动存储和访问累积的

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

有没有一种方法可以做到这一点,而无需手动存储和访问累积的数据(也就是说,无需重新实现camel的聚合器)

编辑:

路线类似于:

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

为了清晰起见,我省略了一些标记和属性(
correlationExpression
completionPredicate
strategyRef
,等等)

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

例如(是的,这是一个相当做作的例子,但请容忍我),假设该协议涉及到客户端发送一条包含其预期发送的数据消息总数的页眉消息。然后,它发送一系列数据消息,这些数据消息的数量可能与其预期发送的数据消息的数量不同。最后,它发送一条页脚消息或结束消息。然后,服务器应以差异b进行响应在预期的消息数量和实际的消息数量之间。如果路由为书面形式,这是不可能的,因为
消息处理器
不知道消息数量,它只处理单个消息。
completeMessageProcessor
,具有聚合消息(由标题、所有数据和结尾组成)不知道该数字,但在该点生成的响应不会传播回
mina
端点


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

从顶部看,我的猜测是
messageProcessor
正在设置OUT消息,而
completeMessageProcessor
正在设置输出消息IN消息。使用者响应期望/使用OUT消息

您可以添加一些来验证这一点。如果是这种情况,则可以将
消息处理器
更改为使用IN-body(或使用Exchange标头),并在
completeMessageProcessor
之后添加转换,以基于IN-body设置OUT-body

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

${in.body}
有关更多信息,请参见此:


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

从顶部开始,我猜
消息处理器
正在设置输出消息,而
completeMessageProcessor
正在设置输入消息。消费者响应期望/使用输出消息

您可以添加一些来验证这一点。如果是这种情况,则可以将
消息处理器
更改为使用IN-body(或使用Exchange标头),并在
completeMessageProcessor
之后添加转换,以基于IN-body设置OUT-body

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

${in.body}
有关更多信息,请参见此:


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

发布您的路由…不确定您所说的“响应在发送之前(或同时?)发送到聚合器…”发布您的路由…不确定您所说的“响应在发送之前”是什么意思(或同时?)消息被发送到聚合器…”这就是它。谢谢!我一直在无意中依赖camel的默认值,即如果没有设置OUT消息,则传播IN消息,并且由于
处理设置了OUT消息(而不是返回传播IN消息)而被绊倒。因此,我在聚合器正确设置发送消息之前使用的
标记,这就是为什么我在那里得到响应,但在聚合器之后没有得到响应。太棒了…很高兴我能提供帮助…我已经做了那么多次HRM。显然,我错了,它不起作用。返回的响应仍然是经过计算的响应在
messageProcessor
中,而不是在
completeMessageProcessor
中,即使我在那里显式地设置了OUT消息体。事实上,如果我没有在
messageProcessor
中设置OUT消息,返回的响应是
null
。在进一步研究之后,似乎聚合策略确实如此不接收原始Exchange,而是一份副本。我可以通过在不同点检查Exchange ID来验证这一点。在整个链中,直到聚合器之前,Exchange ID保持不变。不过,作为
newExchange
传递到聚合策略的Exchange具有不同的ID。鉴于此,它是因此,发送回mina端点的响应不是聚合器生成的响应也就不足为奇了,因为它位于不同的交换上。看起来我运气不好。:(我明白你的意思,聚合器创建了一个新的交换,目的地是