Camel Inter模块协调 - 依赖

时间:2014-01-07 02:30:51

标签: apache-camel esb

我的问题是我有一个routeBuilder,根据url模式进行路由到不同的模块,如下所示A(B,D)(customProcessor将ARestURN,BRestURN等添加到标题中,这些标题将是匹配的逗号分隔的url模式反对标题CamelHttpUri以路由到正确的模块)

from("servlet:///?matchOnUriPrefix=true")
  .process(customProcessor)
    .choice()
    .when(simple("${in.headers.ARestURN} contains ${in.headers.CamelHttpUri}"))
       .to("http4://" + AUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false")
    .when(simple("${in.headers.BRestURN} contains ${in.headers.CamelHttpUri}"))
       .to("http4://" + BUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false")
    .otherwise()
       .to("http4://" + DUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false");

我现在的问题是我需要服务一个REST网址请求,这需要我接受AUrl和BUrl并汇总结果,然后回复请求我该如何实现?

我想写下面的内容

from("servlet:///?matchOnUriPrefix=true")
  .process(customProcessor)
    .choice()
    .when(simple("${in.headers.ARestURN} contains ${in.headers.CamelHttpUri}"))
       .to("http4://" + AUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false")
    .when(simple("${in.headers.BRestURN} contains ${in.headers.CamelHttpUri}"))
       .to("http4://" + BUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false")
  .when(simple("${in.headers.MultiModuleRestURN} contains ${in.headers.CamelHttpUri}"))
   .to("direct:multimodule")
    .otherwise()
       .to("http4://" + DUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false");

from("direct:multimodule")
   .process(new MyProcessor())
      .to("http4://" + AUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false");

但我不知道如何从第一个“AUrl”(这是一个返回json结果的REST服务)获得结果并对其进行一些处理并将结果的特定值提供给下一个url,这是BUrl得到的结果来自它并处理结果并将结果发送回调用服务。

例如:

the REST call :    /AB/123/getPrice
Need to pass 123 to Module A - REST call ->  /A/123/getId     response-{A: 123, id: x1}
Need to pass x1 to Module B  - REST call ->  /B/x1/getPrice   response-{id: x1, p:$10}
Need to return to caller {name: 123, id: x1, price: $10 } (json combined object)

更新:暂时如下, 注意:为清晰起见,删除了bridgeEndpoint的内容

from("servlet:///?matchOnUriPrefix=true")
   .process(customProcessor)
     .choice()
       .when(simple("${in.headers.multiRestURN} contains ${in.headers.CamelHttpUri}"))
         .to("direct:multimodule")
       .when(simple("${in.headers.ARestURN} contains ${in.headers.CamelHttpUri}"))
         .to("http4://" +AUrl)
       .when(simple("${in.headers.BRestURN} contains ${in.headers.CamelHttpUri}"))
         .to("http4://" +BUrl)
       .otherwise()
         .to("http4://" +DUrl);
//    
from("direct:multimodule")
 .to(ExchangePattern.InOut,"http4://"+AUrl)
   .convertBodyTo(String.class) 
     .process(customAProcess)
      .to(ExchangePattern.InOut, "http4://"+BUrl+"/resources")
         .convertBodyTo(String.class) 
         .process(customBProcessor);

在customAProcess中,我做了一个     exchange.getIn()。setHeader(“AData”,exchange.getIn()。getBody(String.class));

所以当BUrl请求带有结果时,这个数据是可用的,我发送给BUrl不必要的数据,但这有希望解决这个问题,也许当我有时间时,我会研究更丰富和聚合策略来解决问题。

1 个答案:

答案 0 :(得分:0)

Enricher component可能就是你要找的东西。它是一种常见模式的实现。请注意,可以通过strategyRef参数传递聚合策略的实现。

在为您的第一次休息调用实施聚合策略时,您可以通过返回的第一个休息响应数据来丰富原始交换 - 请参阅AggregationStrategy的界面。只需创建策略的bean并配置更丰富的。

希望它有所帮助。示例上下文:):

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
   <route>
      <from uri="servlet:///?matchOnUriPrefix=true"/>
      <enrich uri="http4://serviceA" strategyRef="strategyA"/>
      <enrich uri="http4://serviceB" strategyRef="strategyB"/>
    </route>
</camelContext>
<bean id="strategyA" class="..." />
<bean id="strategyB" class="..." />

你可以用你的交换做任何你想做的事情,无论是原创(丰富)还是新的(丰富)聚合策略。