【问题标题】:Apache Camel how to add/remove endpoints dynamically from a routeApache Camel 如何从路由中动态添加/删除端点
【发布时间】:2017-08-17 09:05:05
【问题描述】:

我正在尝试熟悉 EIP 和 Apache Camel,我有一个用例,我不太确定如何使用 Camel 表达或实现

用例:

假设您设计了一个集成解决方案,该解决方案从 ftp 获取文件,进行一些处理并将其上传到队列中。你选择了 Apache Camel 来实现这个解决方案,你在 Java DSL 中的路由看起来像这样:

 from("ftp://user@hostname/directoryname")
   .process(new Processor() {
              public void process(Exchange exchange) throws Exception
              {
                //my fantastic prosessing goes here
              }
 }).to("jms:queue:queueName");

路线可能比这更复杂,但这并不重要。想象一下,您的解决方案取得了如此巨大的成功,以至于计划实施一项服务,任何人都可以添加他的 ftp 服务器并处理文件并将其上传到队列中。所以你想要的是

  1. (灵活性)能够从您的应用中动态添加/删除服务器
  2. (扩展)能够处理大量此类服务器

让我们忘记#2,专注于灵活性部分。

所以问题是,我想:

如何在 Apache Camel 路由中动态(在运行时)添加/删除端点?

到目前为止我的考虑:

首先,我承认我对集成模式不太熟悉,但只是浏览目录,唯一符合要求的就是 Content Enricher。它可以接受一条消息,然后去其他地方并带来其他东西。所以我在想,如果有人添加了一个 ftp 服务器,连接详细信息可以封装在消息中,然后 Content Enricher 可以连接到该 ftp 服务器并获取文件并通过路由进一步推送它。 .. 所以它实际上是一个 Content Enricher 能够连接到多个 ftp 服务器的.. 那种声音是错误的。首先,我认为这不是该模式背后的意图,其次,由于 Camel 中有 ftp Component,我应该能够以某种方式在那种情况下使用它

第二种方法是像使用 vm 组件一样将路由分成两部分,如下所示:

 from("ftp://user@hostname/directoryname").to("vm:internalQ");
 from("vm:internalQ")
   .process(new Processor() {
              public void process(Exchange exchange) throws Exception
              {
                //my fantastic prosessing goes here
              }
 }).to("jms:queue:queueName");

所以现在,我可以使用写入该内部队列的 ftp 端点创建许多路由,以便可以拾取它。将路由动态添加到 CamelContext 似乎是可能的 (Add camel route at runtime in Java)。这是要走的路吗?还是我只是想以一种不适合的方式使用 Camel

【问题讨论】:

  • 我认为我没有正确回答问题。您可以根据需要从 ftp 读取尽可能多的骆驼路线。您可以使用标头 - CamelFileName、CamelFileHost、CamelFileLocalWorkPath 使用相同的路由来路由文件..
  • 你能在不中断上下文的情况下动态添加和删除路由吗?这是我不确定的动态部分
  • 我想我把自己固定在动态添加端点到路由的想法上,但也许,应该动态添加的路由......哪种有意义......我猜

标签: java apache-camel integration


【解决方案1】:

您可以动态添加路由到您的CamelContext

MyRouteBuilder trb = new MyRouteBuilder(servletEndpoint, mockEndpoint);
camelContext.addRoutes(trb);

还有 MyRouteBuilder:

MyRouteBuilder(Endpoint servletEndpointStart, MockEndpoint mockEndpointEnd, String allowedParameters){
        this._servletEndpoint = servletEndpointStart;
        this._mockEndpoint = mockEndpointEnd;
    }

    @Override
    public void configure() throws Exception {
        from(this._servletEndpoint)
        .id(TESTING_ROUTE_NAME)
        .process(new Processor(){ // some processor })
        .to(_mockEndpoint);
    }

您也可以修改路线,但您需要重新启动它,才能正常工作,检查它是如何完成的: org.apache.camel.model.RouteDefinition.adviceWith(ModelCamelContext, RouteBuilder)

【讨论】:

  • 我接受答案,但我仍然不确定这是处理这个特定用例的最佳方式。谢谢
猜你喜欢
  • 2018-07-01
  • 2016-03-22
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
相关资源
最近更新 更多