【问题标题】:Apache Camel - Build both from and to endpoints dynamicallyApache Camel - 动态构建端点和端点
【发布时间】:2016-10-16 19:43:25
【问题描述】:

我有一条骆驼路线,它处理来自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 中,我正在填充Iddestination server path。现在我需要定义一个使用上传队列中的消息的新路由,并复制一个本地文件夹(基于先前路由中生成的 Id)并将其上传到作为 ftp 服务器的目标文件夹(这也填充在先前的路由中)

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

from("activemq:queue:upload" )
        .from("file:basePath/"+{idFromExchangeObject})
    .to("ftp:"+{serverIpFromExchangeObject}+"/"+{pathFromExchangeObject});

【问题讨论】:

  • 我认为这不可能。看到这个答案:stackoverflow.com/a/15254698/86798
  • 是吗?谢谢@Mr Gravity,不过我还是会做一些研究!
  • VG Hedge - 在您链接到的问题中,Claus 还回答说该问题已得到解决。
  • 可以使用.toD()指定动态Camel端点camel.apache.org/how-to-use-a-dynamic-uri-in-to.html
  • @Mike Barlotta 谢谢。这解释了如何形成动态到 () 端点。现在如何形成动态 from() 端点?

标签: apache jms apache-camel activemq endpoint


【解决方案1】:

可以使用.toD() 描述on this page on the Camel site. 在Camel 中向端点添加动态(如注释中所述) 我不知道有任何 fromD() 等价物。但是,您可以通过在CamelContext 上调用addRoutes 方法来添加动态路由。这在this page on the Camel site. 上有所描述

稍微扩展 Camel 网站的示例,应该会让您朝着正确的方向前进。

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 和功能。

【讨论】:

  • 非常感谢@Mike Barlotta。这个解决方案也有效:)
【解决方案2】:

我认为对于您的情况有更好的替代方案,当然您使用的是 2.16 之后的 Camel 版本。(存在以前版本的替代方案,但更复杂且看起来不优雅 - (例如 consumerTemplate & 收件人列表)。

您可以将第一个“动态来源”替换为 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、pathFromExchangeObject 将包含在丰富后的聚合交换中。如果您不包含自定义策略,那么 Camel 默认使用从资源中获取的主体。查看 content-enricher.html 中的 ExampleAggregationStrategy 示例以了解其工作原理。

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

【讨论】:

  • 非常感谢@ltsallas。这就是我一直在寻找的。它奏效了 :) 我有几个问题: 1. 在聚合策略中,我只是将所需的标头从 oldExchange 设置为 newExchange 并返回 newExchange 而没有别的。这样好吗? 2. 由于我们是根据不同的参数动态添加路由,我们应该手动删除路由吗?
  • @vg-hegde 1. 是的,这很好。您可以在聚合策略中做任何您喜欢的事情。它取决于您的要求。 2.我不太明白第二个问题。你在哪里动态添加路由?
  • 抱歉忘记回复了! . “动态添加路线”我的意思是 Mike Barlotta 提供的另一个答案
  • @VGHegde 我看到了你较新的相关问题。我的示例不适用于递归选项。 pollEnrich 不支持批处理操作 :(。因此,除非您可以 1) 在轮询之前压缩文件夹,否则动态路由可能是您的最佳选择。 2)轮询压缩文件夹(一个文件)。 3) ftp 压缩文件(如果文件夹的内容未压缩,则传输大小较小的优势) 4) 使用 ssh 远程提取文件夹-不知道这是否可能!。我在本地试过。在此处查看示例gist.github.com/ltsallas/…
  • 非常感谢。对于其他人 - 相关问题是link
猜你喜欢
  • 2015-04-06
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多