Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 路由范围内的完成处理程序在路由中间触发_Apache Camel - Fatal编程技术网

Apache camel 路由范围内的完成处理程序在路由中间触发

Apache camel 路由范围内的完成处理程序在路由中间触发,apache-camel,Apache Camel,我对Camel 2.19.1有问题。和onCompletion具有路由范围的处理程序。运行时是Java8,Karaf4.0.9。骆驼上下文是用Blueprint构建的 我已经定义了3条路由,每个路由都有一个onCompletion处理程序: <onCompletion mode="BeforeConsumer" parallelProcessing="false" onCompleteOnly="true" useOriginalMessage="false"> <lo

我对Camel 2.19.1有问题。和
onCompletion
具有路由范围的处理程序。运行时是Java8,Karaf4.0.9。骆驼上下文是用Blueprint构建的

我已经定义了3条路由,每个路由都有一个onCompletion处理程序:

<onCompletion mode="BeforeConsumer" parallelProcessing="false" onCompleteOnly="true" useOriginalMessage="false">
    <log message="<route_name> Success." loggingLevel="INFO" logName="policy-repository-adapter" />
</onCompletion>
顶级路由
prasoap端点
如下所示(显然是伪代码):

顶级路由和onCompletion处理程序的日志输出如下所示:

route checkpoint 1
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
route checkpoint 2
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
请注意,onCompletion处理程序被多次激发。除此之外,顶级路由的onCompletion处理程序在路由实际完成之前被触发(日志语句
pra soap端点成功。
日志语句
路由检查点2
之前)

我所期望的是:

route checkpoint 1
send-to-pas-endpoint Success.
xacml-policy-query Success.
route checkpoint 2
pra-soap-endpoint Success.

这是Camel中的一个bug,还是我对
onCompletion
处理程序如何工作的误解?

这种行为是正确的。您在您的
onCompletion
定义中指定了
mode=“BeforeConsumer”
,这改变了Camel的行为(从2.14开始)

发件人:

骆驼2.14:onCompletion已修改为支持以同步或异步模式(使用线程池)运行完成任务,以及支持在路由使用者完成之前还是之后运行完成任务。原因是要给予更多的灵活性。例如,指定在路由使用者完成之前运行同步,这允许在使用者将任何响应写回被叫方之前修改交换。例如,您可以使用它添加客户标题,或发送到日志以记录响应消息等

同样,在其自己的章节中:

onCompletion支持两种模式
售后消费者-消费者完成后运行的默认模式。
BeforeConsumer-在消费者完成之前以及消费者向被叫方回写响应之前运行。
售后消费者模式是默认模式,其行为与旧版驼峰版本相同。
新的BeforeConsumer模式用于在使用者将其响应写回被调用方之前运行onCompletion(如果处于InOut模式)。这允许onCompletion修改交换,例如添加特殊头,或将交换记录为响应记录器等



作为一种解决方案,可以使用
售后消费者
模式,也可以将模式设置为
I仅

我看到3个
xacml策略查询成功。
行。可能是您的路由是并行触发的,并且多个线程正在执行它吗?尝试在日志中添加线程名称。@AlessandroDaRugna,这只是我从测试客户端发送的帖子。对于我发送的每一个帖子,我得到的日志输出都有相同的线程名和面包屑ID.,为什么要在路由中间调用完成回调呢?对我来说,这似乎没有什么用处。路由未完成,后续将执行更多处理步骤。我认为有用的行为是在路由的最后一个处理步骤之后,但在将交换发送回调用方之前触发回调。@Ralf您描述的是正常行为。使用
BeforeConsumer
模式,您可以更改Camel调用Completion回调的方式。文档中提供的示例说明,您可以在发送到chid routes之前添加自定义头。我对
onCompletion
钩子的理解是,它完全是在路由(消费者)完成后对交换进行“后处理”。before/after consumer模式仅将后处理的时间点移动到将交换返回给路由的调用者之前或之后。因此,您是否可以影响调用者接收到的响应。我对您所说的理解是,
beforecumer
模式允许在将交换发送到子路由之前对其进行按摩。但这几乎是每一条路线所做的,与“完成”路线无关。我同意,使用不同的名称/命令会更合适。我认为BeforeConsumer模式的作用类似于Splitter的onPrepareRef:
route checkpoint 1
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
route checkpoint 2
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
send-to-pas-endpoint Success.
xacml-policy-query Success.
pra-soap-endpoint Success.
route checkpoint 1
send-to-pas-endpoint Success.
xacml-policy-query Success.
route checkpoint 2
pra-soap-endpoint Success.