Я пытаюсь повторно использовать маршруты Camel в пределах того же CamelContext, используя routeContext, но я вижу, что существуют ограничения с использованием onException, intercept, dataFormats, как указано в Как импортировать маршруты из другихXML-файлы
Другой вариант - использовать множество конечных точек camelContext и vm-direct для связи между ними, но существует ограничение только на один camelContext с Spring Boot.Об этой альтернативе я нашел эту статью Как настроить несколько контекстов Camel в приложении Spring Boot .
Есть ли другая альтернатива, позволяющая обмениваться маршрутами без каких-либо ограничений?
Вопрос, связанный с Контекст нескольких верблюдов не принят в модели Spring Boot Came single configl xml?
Добавлена дополнительная информация :
Я хочу построить полный рабочий процесс обработки в одном большом маршруте с множеством небольших маршрутов, где каждый маршрут выполняет определенную задачу.Я предпочитаю использовать 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:
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 не нравится, когда внутри него работает более одного верблюжьего контекста: / * Маршруты tranformationIN (appContextTranformationIn) и tranformationOUT (appContextTranformationOut) будет в одном camelContext, но проблема с Spring Boot у него та же.