Apache Camel如何从路由

时间:2017-03-24 12:15:43

标签: java apache-camel integration

我正在尝试熟悉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. (缩放)能够处理潜在的大量此类服务器
  3. 让我们忘掉#2并专注于灵活性部分。

    所以问题是,我想:

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

    到目前为止我考虑过的事情:

    首先,我承认我对Integration Patterns并不熟悉,但只是扫描目录,唯一可以满足要求的是 Content Enricher 。它可以传递信息,然后去其他地方并带上其他信息。所以我在考虑是否有人添加了一个ftp服务器,连接细节可以封装在消息中,然后 Content Enricher 可以连接到该ftp服务器并获取文件并将其推送到该路径中。 ..所以它实际上是一个能够连接到多个ftp服务器的 Content Enricher ....这种声音是错误的。首先,我不认为这是该模式背后的意图,其次是因为Camel中的ftp 组件,我应该能够在那种情况下使用它

    第二种方法是将路径分成两个,例如使用 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

1 个答案:

答案 0 :(得分:2)

您可以动态地将路线添加到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)