【发布时间】: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 服务器并处理文件并将其上传到队列中。所以你想要的是
- (灵活性)能够从您的应用中动态添加/删除服务器
- (扩展)能够处理大量此类服务器
让我们忘记#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