我正在尝试熟悉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服务器并将文件处理并上传到队列中。所以你想要的是
让我们忘掉#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 ?
答案 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)