Условная маршрутизация Apache Camel

У меня есть служба, которая имеет две операции.

RegisterUser
UpdateUser

У меня есть верблюжий разгром:

<camel:route id="myRoute">
    <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />            
    <camel:bean ref="processor" method="processMessage"/>
    <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
    <camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>

В моем bean-компоненте процессора, когда я указываю:

RegisterUser registerUser = exchange.getIn().getBody(RegisterUser.class);

Я получаю объект регистрации пользователя. Все работает нормально. Проблема в том, что я хочу, чтобы верблюд перенаправлял мой запрос условно, например:

Если операция службы RegisterUser, я хочу направить сообщение в мой конкретный компонент, а если операция службы UpdateUser, я хочу направить сообщение в другой компонент.

Я пытался использовать верблюжий xPath, но, похоже, он не работает.

<camel:route id="myRoute">
    <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />  
    <camel:choice>
        <camel:when>
            <camel:xpath>
                //RegisterUser
            </camel:xpath>
            <camel:bean ref="processor" method="processMessage"/>
            <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
        </camel:when>
    </camel:choice>                        
    <camel:to uri="cxf:bean:myTargetEndpoint"/>
</camel:route>

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


person Paulius Matulionis    schedule 27.07.2012    source источник


Ответы (4)


Информация о необходимой операции будет в заголовке сообщения.

Заголовок, который вы ищете, называется «имя_операции».

Итак, вот пример:

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="example">
        <from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />
        <log message="The expected operation is :: ${headers.operationName}" />
        <choice>
            <when>
                <simple>${headers.operationName} == 'RegisterUser'</simple>
                    <bean ref="processor" method="processMessage"/>
                <to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
            </when>
            <when>
                <simple>${headers.operationName} == 'UpdateUser'</simple>
                <!-- Do the update user logic here -->
                <bean ref="processor" method="updateUser" />
            </when>
        </choice>
    <to uri="cxf:bean:myTargetEndpoint"/>
    </route>
</camelContext> 

(Обратите внимание, что в примере используется план apache aries, но он будет идентичен для весны, кроме пространства имен)

person AlanFoster    schedule 27.07.2012
comment
Это отлично работает для меня. Именно то, что мне было нужно. Спасибо! :) - person Paulius Matulionis; 31.07.2012

попробуйте использовать выражения camel-simple вместо xpath для этого...

<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when>
person Ben ODay    schedule 27.07.2012

Spring XML route В моем случае я использую входящий Jetty EP. Проверяю параметр в запросе. Привлечь URL-адрес http://localhost:8080/srv?alg=1

    <choice id="_choice1">
    <when id="_when1">
        <simple>${in.header.alg} == '1'</simple>
        <log id="_log10" message="LOG ALG 1"/>
    </when>
    ...
    <otherwise id="_otherwise1">
        <setFaultBody id="_setFaultBody1">
            <constant>Return message about ERROR</constant>
            </setFaultBody>
    </otherwise>
</choice>
person Mikro Koder    schedule 27.05.2018

person    schedule
comment
Ответы, содержащие только код, обычно не одобряются на этом сайте. Не могли бы вы отредактировать свой ответ, включив в него некоторые комментарии или объяснение вашего кода? Объяснения должны отвечать на такие вопросы, как: Что он делает? Как это делается? Куда это идет? Как это решает проблему ОП? См.: Как ответить. Спасибо! - person Eduardo Baitello; 25.11.2019