当前位置: 首页 > 知识库问答 >
问题:

Camel模块间协调依赖

宰父飞翼
2023-03-14
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 url请求,它要求我acccess、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)
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);

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

共有1个答案

陈泰宁
2023-03-14

Enricher组件可能是您正在寻找的。它是一种常见模式的实现。请注意,可以通过strategyRef参数传递聚合策略的实现。

当为第一次rest调用实现聚合策略时,您可以通过第一次rest响应返回的数据来丰富原始交换-请参见AggregationStrategy的界面。只需创建策略的bean并配置Enricher。

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

<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="..." />
 类似资料:
  • Velocity 不依赖 jQuery Velocity.js 可以在不引入 jQuery 的情况下单独使用。如果 你需要大部分动画效果能兼容 IE8,就必须引入 jQuery 1×。 它也可以和 Zepto 一起使用,写法和 jQuery 一样: // 无 jQuery 或 Zepto 时,Velocity()方法挂载在 window 对象上 (window.velocity) // ( 第一

  • 本文向大家介绍android-gradle 模块依赖,包括了android-gradle 模块依赖的使用技巧和注意事项,需要的朋友参考一下 示例 在多项目中gradle build,您可以与构建中的另一个模块具有依赖关系。 例: 该compile project(':mylibrary')行将名为“ mylibrary”的本地Android库模块声明为依赖项,并要求构建系统在构建应用程序时编译并包

  • 让我们创建一个名为的新模块,并在那里定义CounterService。 app/shared/shared.module.ts 现在我们将引入 SharedModule 到AppModule 和中。 app/lazy/lazy.module.ts 使用此配置,两个模块的组件都可以访问CounterService。 我们将以完全相同的方式在EagerComponent和LazyComponent中使

  • 在使用Maven一段时间后,我对Maven在构建体系结构中带来的许多特性感到兴奋,尤其是依赖项管理。然而,我一次又一次地遇到了一个问题--Maven如何解决多模块项目之间的依赖关系。我想知道这是否是当前Maven实现的大缺陷和/或是否有任何令人满意的解决方案。 假设我有一个多模块的Maven项目。父pom包含三个模块--moduleA(jar)、moduleB(jar)和moduleC(war)。

  • 在php 5.1中, 扩展之间的内部依赖是可以强制性的. 由于扩展可以静态构建到php中, 也可以构建为共享对象动态加载, 因此强制依赖需要在两个地方实现. 配置时模块依赖 第一个位置是你在本章课程中刚刚看到的config.m4文件中. 你可以使用PHP_ADD_EXTENSION_DEP(extname, depname[ , optional])宏标识extname这个扩展依赖于depname

  • 下面的章节提供所有 Jersey 模块和与各自的二进制文件链接的依赖关系的概述(点击模块名称可以得到下载该模块的链接)。(译者注:下面的列表就不翻译了)<br>