Apache Camel: Как лучше всего использовать маршруты Camel из других маршрутов? - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь повторно использовать маршруты 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 у него та же.

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете повторно использовать каждый маршрут в контексте верблюда из любого другого маршрута.Это просто вопрос , как ваши маршруты спроектированы .

Вы можете создать полный рабочий процесс обработки одним большим маршрутом.Но если вы создаете второй рабочий процесс, он не может использовать ничего из первого маршрута, он вообще не может использоваться повторно.

Но если вы создаете один и тот же рабочий процесс с множеством небольших маршрутов, где каждый маршрут выполняет определенную задачу , вы можете создать второй рабочий процесс, который может использовать почти каждый блок первого.

Как правило, эти небольшие маршруты выглядят так:

from(direct:validation)
    .bean(...)
  • У них есть конечная точка direct для простого вызова из любого другого маршрута (синхронно)
  • Они выполняют только одну задачу
  • У них нет to() «выхода», так как они запрос / ответ и, следовательно, они возвращаются вызывающей стороне, когда маршрут закончен

Если вы строите блоки многократного использования, подобные этим, вы можете вызывать их с каждого «основного» маршрута.

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

ДОПОЛНИТЕЛЬНО из-за дополнительной информации в вопросе

КВаша первая попытка : Вы не можете использовать dataFormat в routeContext.Вам нужно будет переместить его в camelContext и просто сослаться на него из routeContext.

Фрагмента из Camel Docs :

Примечание:При использовании routeContext они разделяются и не могут повторно использовать существующие onException, intercept, dataFormats и аналогичные функции сквозной резки, определенные в camelContext.Другими словами, routeContext в настоящее время изолирован.

На вашу вторую попытку : Если вы используете 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...