从逻辑的角度来看,这是我希望实现的路由行为类型:
我希望能够将外部服务的响应与原始请求合并。
我已经能够使用多播、聚合器和模拟endpoint来实现它,但我想知道是否有更干净的方法。我当前的实现如下所示:
<multicast strategyRef="serviceAggregator" stopOnException="false">
<to uri="mock:foo" />
<to uri="http://0.0.0.0:9999/service/?throwExceptionOnFailure=false" />
</multicast>
<camel:to uri="log:uk.co.company.aggregated?showAll=true" />
<to uri="http://0.0.0.0:9999/anotherService/
我特别不喜欢的部分是使用模拟endpoint,但我也不认为这是表达上图的一种非常易读的方式。所以我想知道是否有更优雅的方法来做到这一点?
我建议阅读EIP模式,例如内容丰富http://camel.apache.org/content-enricher.html
您可以在其中将回复消息与请求消息合并。
头脑的内容更丰富有2种模式-丰富-污染丰富
确保从上面链接中的文档中注意到差异。
<route>
<from uri="...">
<enrich uri="http://0.0.0.0:9999/service/?throwExceptionOnFailure=false" strategyRef="serviceAggregator"/>
<to uri="log:uk.co.company.aggregated?showAll=true" />
<to uri="http://0.0.0.0:9999/anotherService/>
...
</route>
是的,您的图表显示的是拆分器,但是示例代码使用的是多播EIP。
您可以简单地将原始消息存储在标头或属性中,然后在bean中进行一些合并。使用标头和当前主体。
. setHeader("orig",body()).to("externalService").bean(new MyMergeBean())