我是Camel的新手,我正在努力做到以下几点。
我想两次处理同一条消息。我必须先转换这两条消息并先处理一条消息然后再处理第二条消息,只要第一条消息成功执行(我有条件)。
我首先尝试使用多播。然后我转换每条路线中的消息。第一个(operation_DC)仅在成功消息时才向第二个消息(operation_AC)发送成功消息。第二个操作包含一个聚合,它等待两个消息都超时。我只想处理来自多播的消息并丢弃另一个消息。
<route id="t_operation_ME">
<from uri="direct:operation_ME" id="t.direct.aggregatedService"></from>
<setHeader headerName="id">
<simple>exchangeId</simple>
</setHeader>
<multicast parallelProcessing="true" strategyRef="defaultAggregationStrategy" stopOnException="true" onPrepareRef="cleanHeader" parallelAggregate="false" completionPredicate="">
<to uri="direct:operation_DC"></to>
<to uri="direct:operation_AC"></to>
</multicast>
</route>
<route id="direct:operation_DC">
<from uri="direct:operation_DC" />
<log message="ENTER DC"></log>
<to uri="xslt:{{depasse:core.transformation.xml.path}}client/t/Operation_toDC_request.xsl" id="t.dc.transform.productos" />
<to uri="activemq:QCIn" id="t.dc.qcin.queue.send"></to>
<log message="EXIT DC ${body}"></log>
<choice>
<when>
<xpath>//Data/Status[. = 'OK']</xpath>
<log message="SEND TO AC"></log>
<to uri="direct:operation_AC"></to>
</when>
</choice>
</route>
<route id="direct:operation_AC">
<from uri="direct:operation_AC" />
<log message="ENTER AC"></log>
<aggregate completionTimeout="20000" completionSize="2" discardOnCompletionTimeout="true" strategyRef="tAggregationStrategy">
<correlationExpression>
<simple>header.id</simple>
</correlationExpression>
<log message="ENTER AGG AC ${body}"></log>
<to uri="xslt:{{depasse:core.transformation.xml.path}}client/t/Operation_toAC_request.xsl" id="t.ac.transform.productos" />
<to uri="activemq:QCIn" id="t.ac.qcin.queue.send"></to>
<log message="EXIT AC ${body}"></log>
</aggregate>
<log message="END AC\n${body}"></log>
</route>
事情是,当我记录“EXIT AC”和“END AC”时,消息是不同的。这意味着在服务器中我正在正确观察进程,AC客户端收到错误消息。
答案 0 :(得分:0)
多播将消息副本始终发送到标记之间的每个端点。如果只想在operation_DC成功运行后调用route operation_AC,则不应该使用多播,但是应该在operation_DC的开头保存正文,例如使用属性和Camel Simple:
<from uri="direct:operation_DC" />
<setProperty propertyName="body">
<simple>${body}</simple>
</setProperty>
在调用operation_AC之前设置body从一开始就带来消息体:
<setBody>
<simple>${property.body}</simple>
</setBody>
<to uri="direct:operation_AC"/>