【问题标题】:Camel Interceptor per Endpoint, not per CamelContext每个端点的骆驼拦截器,而不是每个 CamelContext
【发布时间】:2015-11-27 17:59:14
【问题描述】:

是否可以为每个 Endpoint 而不是每个 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" />

当我在每个骆驼上下文中使用拦截器声明每个端点时,我没有问题,但这是一个错误的模式,有很多复制粘贴。

在这个question 中,我看到有一条信息“我认为使用 InterceptorStrategy 是不可能的,因为它期望它在同一个骆驼上下文中运行”。更重要的是我认为在一个应用程序中使用多个上下文是bad pattern


更新

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

【问题讨论】:

    标签: java apache-camel esb interceptor


    【解决方案1】:

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

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

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

    【讨论】:

    • 说实话,我不明白。在将消息发送到外部端点之前,我需要使用拦截器。 可用于在路由中路由 Exchange 时的每个处理步骤 - 来自文档:camel.apache.org/intercept.html。我认为这是另一种情况。
    • 我想说的是写一个你可以在每个骆驼上下文中重用的处理器。
    【解决方案2】:

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

    check how import routes to camel-context

    【讨论】:

    • 是的。但我想知道,对于拦截,我们如何导入拦截规则?导入路由仅适用于包含在 拦截在路由上下文之外不是吗?不太确定。
    • 是的,拦截器在路由上下文之外。它可以在一个全局骆驼上下文中。
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多