gpt4 book ai didi

java - Apache Camel : What is the best way to reuse Camel routes from other routes?

转载 作者:行者123 更新时间:2023-11-30 07:46:12 28 4
gpt4 key购买 nike

我正在尝试使用 routeContext 在同一个 camelContext 中重用 Camel 路由,但我发现 onException、intercept、dataFormats 的使用存在限制,如 How do I import routes from other XML files 中所述

另一种选择是使用许多 camelContext 和 vm-direct 端点在它们之间进行通信,但 Spring Boot 只能使用一个 camelContext。在这个替代方案上,我找到了这篇文章 How to configure multiple Camel Contexts in the Spring Boot application .

是否有任何其他方法可以不受任何限制地共享路线?

Multiple camel context not accepted in Spring Boot Came single configl xml model ? 有关的问题

添加了更多信息:

我想在一条包含许多小路线的大 route 构建完整的处理工作流程,其中每条路线都有特定的任务要做。为了能够使用图形编辑器,我更喜欢 XML DSL 而不是 Java。

主要处理流程将自动生成(不可修改),然后开发团队只需实现具有特定任务的小路线。一个先决条件是我必须使用 Spring Boot。

首先尝试:一个 Camel 上下文并通过 routeContext 导入路由。使用直接端点来传达路由。

文件 mainWorkFlow.xml

<!-- Import routerContexts-->
<import resource="tranformationIN_route.xml"/>
<import resource="tranformationOUT_route.xml"/>
<camelContext id="mainWorkFlow">
<!-- refer to custom routes -->
<routeContextRef ref="tranformationIN"/>
<routeContextRef ref="tranformationOUT"/>
<route id="main">
<from id="_inRequest" uri="cxf:bean:exposedWS"/>
<to id="_validation" uri="inputData.xsd"/>
<!-- Call route in another context for transformation data received to a backend service data model -->
<to id="_toTransformationInRoute" uri="direct:appTransformationInRoute"/>
<!-- Call backend service -->
<to id="_wsBE" uri="cxf:bean:backendWS"/>
<!-- Call route in another context for transformation data from backend service response to exposed service data model -->
<to id="_toTransformationOutRoute" uri="direct:appTransformationOutRoute"/>
</route>
</camelContext>

文件 tranformationIN_route.xml

<routeContext ...>  
<endpoint id="reqTrans" uri="dozer:...req_transformation.xml"/>
<!--
Declare dataFormats used by dozer
-->
<dataFormats>
<jaxb contextPath="some.package" id="someID"/>
</dataFormats>
<route id="tranformationIN">
<from uri="direct:appTransformationInRoute"/>
<to id="_to1" uri="ref:reqTrans"/>
</route>
</routeContext>

文件 tranformationOUT_route.xml

<routeContext ...>  
<endpoint id="reqTrans" uri="dozer:...resp_transformation.xml"/>
<!--
Declare dataFormats used by dozer
-->
<dataFormats>
<jaxb contextPath="some.package" id="someID"/>
</dataFormats>
<route id="tranformationOUT">
<from uri="direct:appTransformationOutRoute"/>
<to id="_to1" uri="ref:respTrans"/>
</route>
</routeContext>

看起来我们不能在 routeContext 中使用 dataFormats:

    Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 
Line 6 in XML document from class path resource [spring/custom-routes.xml] is invalid;
nested exception is org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 22; cvc-complex-type.2.4.a: Se ha encontrado contenido no válido a partir del elemento 'dataFormats'.
Se esperaba uno de '{"http://camel.apache.org/schema/spring":route}'...

第二次尝试:许多 CamelContext。使用 direct-vm 端点来传达路由。

文件 mainWorkFlow.xml

<camelContext id="mainWorkFlow">
<route id="main">
<from id="_inRequest" uri="cxf:bean:exposedWS"/>
<to id="_validation" uri="inputData.xsd"/>
<!-- Call route in another context for transformation data received to a backend service data model -->
<to id="_toTransformationInRoute" uri="direct-vm:appTransformationInRoute"/>
<!-- Call backend service -->
<to id="_wsBE" uri="cxf:bean:backendWS"/>
<!-- Call route in another context for transformation data from backend service response to exposed service data model -->
<to id="_toTransformationOutRoute" uri="direct-vm:appTransformationOutRoute"/>
</route>
</camelContext>

文件 appContextTranformationIn_context.xml

<camelContext id="appContextTranformationIn">
<endpoint id="reqTrans" uri="dozer:...req_transformation.xml"/>
<!--
Data forman generated automatically by dozer
If necessary, here I could use dataFormat, onException and interceptor
-->
<dataFormats>
<jaxb contextPath="some.package" id="someID"/>
</dataFormats>
<!-- -->
<route id="tranformationIN">
<from uri="direct-vm:appTransformationInRoute"/>
<to id="_to1" uri="ref:reqTrans"/>
</route>
</camelContext>

文件 appContextTranformationOut_context.xml

<camelContext id="appContextTranformationOut">
<endpoint id="reqTrans" uri="dozer:...resp_transformation.xml"/>
<!--
Data forman generated automatically by dozer
If necessary, here I could use dataFormat, onException and interceptor
-->
<dataFormats>
<jaxb contextPath="some.package" id="someID"/>
</dataFormats>
<route id="tranformationOUT">
<from uri="direct-vm:appTransformationOutRoute"/>
<to id="_to1" uri="ref:respTrans"/>
</route>
</camelContext>

问题 Spring Bootk 不喜欢在其中运行一个以上的 camelcontext:/ * 路由 tranformationIN (appContextTranformationIn) 和 tranformationOUT (appContextTranformationOut) 将在一个 camelContext 中,但 Spring Boot 的问题相同。

最佳答案

您可以重用 Camel 上下文中的每条路由。这只是如何设计您的路线的问题。

您可以在一条大路线上构建完整的处理工作流程。但是如果你构建第二个工作流程,它就不能使用第一个路线的任何东西,它根本不可重用。

但是,如果您使用许多小路线构建相同的工作流程,其中每条路线都有特定的任务要做,您可以构建第二个工作流程,几乎可以使用第一个工作流程的每个 block 。

通常这些小路线看起来像这样:

from(direct:validation)
.bean(...)
  • 有一个direct 端点可以轻松地从所有其他路由(同步)调用它们
  • 他们只做一项任务
  • 他们没有to()“退出”因为他们是request/reply因此,当路由完成时,它们会返回给调用者

如果您像这样构建可重用 block ,您可以从每个“主要”路由调用它们。

from(...)
.to("direct:validation")
.to("direct:transform")
.to("direct:enrich")
...

由于更多信息的问题而添加

对于您的第一次尝试:您不能在routeContext 中使用dataFormat。您必须将它移动到 camelContext 并从 routeContext 中引用它。

来自 Camel Docs 的片段:

Notice: When you use routeContext then they are separated, and cannot reuse existing onException, intercept, dataFormats and similar cross cutting functionality defined in the camelContext. In other words the routeContext is currently isolated.

致您的第二次尝试:如果您使用的是 Spring Boot,为什么还要坚持使用 XML 路由?图形编辑器可能不错,但 Java 路由不存在您遇到的整个问题。 Spring Boot 是从 Spring XML 配置转移到 Java 配置的主要驱动力之一。

即使你坚持使用 Spring XML 配置,但用 Java 编写你的路由,你也不会有问题。您可以轻松地将所有 RouteBuilder 导入到 Camel 上下文中。

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<routeBuilder ref="myMainRoute" />
<routeBuilder ref="mySpecificRoute1" />
<routeBuilder ref="mySpecificRoute2" />
</camelContext>

关于java - Apache Camel : What is the best way to reuse Camel routes from other routes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50818417/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com