Apache Camel 如何从路由动态 add/remove 端点
Apache Camel how to add/remove endpoints dynamically from a route
我正在尝试熟悉 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 服务器并处理文件并将其上传到队列中。所以你想要的是
- (灵活性)能够从您的应用程序动态 add/remove 服务器
- (扩展)能够处理潜在的大量此类服务器
让我们忘掉#2,专注于灵活性部分。
所以问题是,我想:
如何动态地(在运行时)add/remove 端点 to/from Apache Camel 路由?
到目前为止我考虑的是:
首先,我承认我对 Integration Patterns 不是很熟悉,只是扫了一眼目录,唯一符合要求的是 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?
您可以将路由动态添加到您的 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)
我正在尝试熟悉 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 服务器并处理文件并将其上传到队列中。所以你想要的是
- (灵活性)能够从您的应用程序动态 add/remove 服务器
- (扩展)能够处理潜在的大量此类服务器
让我们忘掉#2,专注于灵活性部分。
所以问题是,我想:
如何动态地(在运行时)add/remove 端点 to/from Apache Camel 路由?
到目前为止我考虑的是:
首先,我承认我对 Integration Patterns 不是很熟悉,只是扫了一眼目录,唯一符合要求的是 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?
您可以将路由动态添加到您的 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)