ESB + Camel根据前一次调用的响应调用多个Web服务

时间:2016-12-09 11:45:22

标签: apache-camel esb apache-servicemix

我正在使用ESB和Camel为我的移动应用程序提供端点。从那里,我需要以这样的方式调用多个Web服务,即前一个调用的响应确定是否应该调用next,并且需要将相同的请求参数传递给多个调用。

此外,我需要在数据库中保存这些响应。

我想知道使用Camel实现这个特定用例的最佳模式。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到 - 只要想想你如何在纯Java中做这样的逻辑,然后将它移到Camel。从行动流程来看,没有区别。你有条件 - 你必须有IF或SWITCH操作。

  1. 直截了当的方式。 在调用上一个服务之后,您在body中有一个响应属性,该属性是下一个调用的决策因素。因此,使用Camel“select-when-otherwise”结构(类似于Java“switch”语句)和“when”使用任何可用的方法来检查来自body的条件(即“simple”,“xpath”,“xquery”等。 )

  2. 如果识别下一个呼叫的逻辑更复杂 - 创建自定义处理器以识别下一个呼叫,设置特殊交换属性然后转到相同的“何时选择”块 对于这种情况作为示例,您可以使用<“previous-result”,“next-call”>或者按照你的意愿去做。

  3. 并且您的路线可能看起来像(我使用Spring):

    <cml:to uri="previous_uri"/>
    <cml:processor ref="my_selector"/> <!-- it sets Exchange property "next_call" based on result from previous -->
    <cml:choice>
        <cml:when>
           <cml:simple>${exchangeProperty.next_call} =="SERVICE1"/>
           <cml:to uri="next_service1_uri"/>
           ... process Service1 result logic ...
        </cml:when>
        <cml:when>
           <cml:simple>${exchangeProperty.next_call} =="SERVICE2"/>
           <cml:to uri="next_service2_uri"/>
           ... process Service2 result logic ...
        </cml:when>
    

    依旧......