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




Вы можете повторно использовать каждый маршрут в контексте Camel из любого другого маршрута. Это просто вопрос как построены ваши маршруты.
Вы можете построить полный рабочий процесс в одном большом маршруте. Но если вы создадите второй рабочий процесс, он не сможет использовать ничего из первого маршрута, его нельзя будет использовать повторно.
Но если вы построите тот же рабочий процесс с множество небольших маршрутов, где каждый маршрут имеет определенную задачу, вы можете построить второй рабочий процесс, который может использовать почти каждый блок первого.
Обычно эти небольшие маршруты выглядят так:
from(direct:validation)
.bean(...)
direct, чтобы легко вызывать их с любого другого маршрута (синхронно)to(), так как они запрос / ответ, и поэтому они возвращаются к вызывающей стороне, когда маршрут завершен.Если вы строите такие многоразовые блоки, вы можете вызывать их из любого «основного» маршрута.
from(...)
.to("direct:validation")
.to("direct:transform")
.to("direct:enrich")
...
ДОБАВЛЕНИЕ из-за дополнительной информации, о которой идет речь
На ваш первая попытка: вы не можете использовать dataFormat в routeContext. Вам нужно будет переместить его на camelContext и просто сослаться на него с routeContext.
Фрагмент из Camel Docs:
Notice: When you use
routeContextthen they are separated, and cannot reuse existingonException,intercept,dataFormatsand similar cross cutting functionality defined in thecamelContext. In other words therouteContextis currently isolated.
К вашему вторая попытка: если вы используете Spring Boot, зачем придерживаться маршрутов XML? Графический редактор может быть приятным, но проблема, с которой вы сталкиваетесь, не связана с маршрутами Java. Spring Boot - один из основных драйверов для перехода от конфигурации Spring XML к конфигурации Java.
И даже если вы придерживаетесь конфигурации Spring XML, но пишете маршруты на Java, у вас не будет проблем. Вы можете легко импортировать все RouteBuilders в Camel Context.
<camelContext id = "camel" xmlns = "http://camel.apache.org/schema/spring">
<routeBuilder ref = "myMainRoute" />
<routeBuilder ref = "mySpecificRoute1" />
<routeBuilder ref = "mySpecificRoute2" />
</camelContext>
Спасибо за ответ!!. Я добавил больше информации.
Я расширил свой ответ
Вам действительно нужно импортировать эти маршруты в определенный класс маршрутов? Как только они будут зарегистрированы через Spring / Camel, вы сможете направлять их через
.to(...)или получать через потребителя, указанного в вашем маршруте (например,direct,seda, ...). Не могли бы вы подробнее объяснить, почему вам нужно импортировать маршруты? Вы даже используете настроенные XML-маршруты или маршруты, настроенные напрямую через Java (рекомендуется в нескольких версиях Camel)