每个端点的 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。
是否可以为每个端点而不是每个 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 中用拦截器声明每个端点时,我没有遇到任何问题,但这是一个错误的模式,有很多复制粘贴。
在此
更新
我试图将我的架构更改为一个 Camel 上下文,其中包含更多路由上下文跟进@Lukasz N 的回答,但我遇到了障碍 CamelBugWithRouteContexts。看起来很难解决我的问题,但它应该适用于高于 2.8 的骆驼版本。
用 Java DSL 或 Spring DSL 编写处理器并包含在每个截距中,
<camel:interceptFrom>
<camel:process ref="InterceptProcessor"></camel:process>
</camel:interceptFrom>
处理器将在何处进行日志记录或您需要的任何其他操作。
您可以编写一个带有端点、拦截器声明等的 camel-context 和多个路由上下文,并将它们导入您的 camel-context。