我的问题是我有一个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不必要的数据,但这有希望解决这个问题,也许当我有时间时,我会研究更丰富和聚合策略来解决问题。
答案 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="..." />
你可以用你的交换做任何你想做的事情,无论是原创(丰富)还是新的(丰富)聚合策略。