Apache Camel如何从路由中动态添加/删除端点



我正在尝试熟悉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 路由中添加/删除端点?

到目前为止,我考虑的是:

首先,我承认我对集成模式不是那么熟悉,但只是浏览目录,唯一符合要求的就是内容丰富器。它可以接受一条消息,然后去其他地方并带来其他信息。所以我在想,如果有人添加 ftp 服务器,连接详细信息可以封装在消息中,然后内容丰富器可以连接到该 ftp 服务器并获取文件并将其进一步推送到路由......所以它实际上是一个能够连接到多个FTP服务器的内容丰富器。这听起来有点不对劲。首先,我不认为这是该模式背后的意图,其次,由于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似乎是可能的(在 Java 中运行时添加骆驼路由)。这是要走的路吗?还是我只是想以一种不是设计的方式使用骆驼

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

最新更新