每个端点的 Camel 拦截器,而不是每个 CamelContext

Camel Interceptor per Endpoint, not per CamelContext

是否可以为每个端点而不是每个 CamelContext 声明拦截器?在我的例子中,我有很多 CamelContexts,我想将带有端点声明和拦截器的公共代码提取到一个文件中:camel-common-context.xml。提取端点是绝对没有问题的,但是如何提取拦截器呢?这是可能的还是它们应该在我想使用端点的每个 CamelContext 中?就我而言,在我在下面发布的修改后,它们在相关的骆驼上下文中不可见:

我的骆驼-普通-context.xml:

<camelContext id="esb" xmlns="http://camel.apache.org/schema/spring">
        <endpoint id="externalSystem" uri="${external.system.url}?throwExceptionOnFailure=false" />

        <interceptFrom>
            <convertBodyTo type="java.lang.String" />
            <when>
                <xpath>not(/soapenv:Envelope)</xpath>
                <process ref="soapFaultProcessor" />
            </when>
            <otherwise>
                <convertBodyTo type="java.lang.String" />
            </otherwise>
        </interceptFrom>

        <interceptSendToEndpoint uri="ref:externalSystem">
            <setHeader headerName="SYSTEM">
                <constant>EXTERNAL</constant>
            </setHeader>
            <convertBodyTo type="java.lang.String" />
            <to uri="log:wSSProcessor_external_system_request?level=DEBUG" />
        </interceptSendToEndpoint>
</camelContext>

其他camel上下文(我只是导入资源):

<import resource="camel-common-context.xml" />

当我在每个 camel-context 中用拦截器声明每个端点时,我没有遇到任何问题,但这是一个错误的模式,有很多复制粘贴。

在此 I see that there is an information that " I dont think this is possible using InterceptorStrategy since that expects it is running in the same camel context". What's more I think that using multiple contexts with one application is a bad pattern


更新

我试图将我的架构更改为一个 Camel 上下文,其中包含更多路由上下文跟进@Lukasz N 的回答,但我遇到了障碍 CamelBugWithRouteContexts。看起来很难解决我的问题,但它应该适用于高于 2.8 的骆驼版本。

用 Java DSL 或 Spring DSL 编写处理器并包含在每个截距中,

<camel:interceptFrom>
    <camel:process ref="InterceptProcessor"></camel:process>
</camel:interceptFrom>

处理器将在何处进行日志记录或您需要的任何其他操作。

您可以编写一个带有端点、拦截器声明等的 camel-context 和多个路由上下文,并将它们导入您的 camel-context。

check how import routes to camel-context