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

时间:2015-09-02 09:32:42

标签: java apache-camel esb interceptor

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

我的camel-common-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>

其他骆驼语境(我只导入资源):

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

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

在这question中,我看到有一个信息是&#34;我不认为使用InterceptorStrategy是可能的,因为它期望它在相同的camel环境中运行&#34;。还有什么我认为在一个应用程序中使用多个上下文是bad pattern

更新

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

2 个答案:

答案 0 :(得分:1)

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

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

处理器将进行记录或您需要的任何其他记录。

答案 1 :(得分:1)

你可以用端点,拦截器声明等和多个路由上下文编写一个camel-context,并在你的camel-context中导入它们。

check how import routes to camel-context