代码之家  ›  专栏  ›  技术社区  ›  VGH

Apache Camel-动态构建端点和端点

  •  2
  • VGH  · 技术社区  · 8 年前

    我有一个驼峰路由,它处理来自 process queue 并发送给 upload queue .

    from("activemq:queue:process" ).routeId("activemq_processqueue")
            .process(exchange -> {
                SomeImpl impl = new SomeImpl();
                impl.process(exchange);
            })
            .to(ExchangePattern.InOnly, "activemq:queue:upload");
    

    在里面 impl.process 我正在填充一个 Id destination server path 。现在我需要定义一个新的路由,它使用来自上传队列的消息,并复制一个本地文件夹(基于以前路由中生成的Id),然后将其上传到目标文件夹,该文件夹是一个ftp服务器(这也在以前的路由中填充)

    那么,如何设计一条新的路由,使从端点到端点都是动态的,如下所示?

    from("activemq:queue:upload" )
            .from("file:basePath/"+{idFromExchangeObject})
        .to("ftp:"+{serverIpFromExchangeObject}+"/"+{pathFromExchangeObject});
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   ltsallas    8 年前

    我认为有一个更好的替代方案适合您的情况,假设您使用的是比2.16更新的Camel版本。(以前版本的替代方案存在,但更复杂,看起来不优雅-(例如consumerTemplate&recipientList)。

    您可以将第一个“dynamic from”替换为pollEnrich,它使用轮询消费者和简单表达式来构建动态文件端点,从而丰富消息。对于第二部分,如前所述,一个动态uri.toD将完成这项工作。因此,您的路线如下所示:

     from("activemq:queue:upload" )
        .pollEnrich().simple("file:basePath/${header.idFromExchangeObject})
        .aggregationStrategy(new ExampleAggregationStrategy()) // * see explanation 
        .timeout(2000) // the timeout is optional but recommended
        .toD("ftp:${header.serverIpFromExchangeObject}/${header.pathFromExchangeObject}") 
    
    1. 请参阅内容丰富器部分“使用动态uri” http://camel.apache.org/content-enricher.html .

      您将需要一个聚合策略,将原始交换与资源交换相结合,以确保在浓缩后聚合交换中将包含头serverIpFromExchangeObject、pathFromExcchangeObject。如果不包含自定义策略,则Camel将默认使用从资源获取的主体。看看内容丰富器中的ExampleAggregationStrategy示例。html来查看这是如何工作的。

    2. 对于.toD(),请查看 http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html
        2
  •  2
  •   Mike Barlotta    8 年前

    可以使用 .toD() 描述如下 on this page on the Camel site. 我什么都不知道 fromD() 相等的但是,您可以通过调用 addRoutes 方法 CamelContext 。这在上进行了描述 this page on the Camel site.

    稍微扩展一下骆驼网站上的例子,应该会让你朝着正确的方向前进。

    public void process(Exchange exchange) throws Exception {
       String idFromExchangeObject = ...
       String serverIpFromExchangeObject = ...
       String pathFromExchangeObject = ...
    
       exchange.getContext().addRoutes(new RouteBuilder() {
           public void configure() {
               from("file:basePath/"+ idFromExchangeObject)
                .to("ftp:"+ serverIpFromExchangeObject +"/"+pathFromExchangeObject);
           }
       });
    }
    

    Camel中可能还有其他选项,因为该框架具有数量惊人的EIP和功能。