当前位置: 首页 > 知识库问答 >
问题:

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

羊舌兴文
2023-03-14

我试图熟悉EIP和Apache骆驼,我有一个用例,我不太确定如何使用骆驼来表达或实现

用例:

假设您设计了一个集成解决方案,它从ftp中获取文件,进行一些处理并将其上传到队列。您选择Apache Camel来实现此解决方案,并且您在JavaDSL中的路由如下所示:

 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骆驼路由?

到目前为止我考虑的是:

首先,我承认我对集成模式不太熟悉,但只要浏览一下目录,唯一符合要求的就是内容丰富器。它可以带着一条信息,然后去别的地方,带上别的东西。所以我在想,如果有人添加一个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");

所以现在,我可以创建许多带有ftpendpoint的路由,这些endpoint可以写入内部队列,这样就可以拾取它。将路由动态添加到CamelContext似乎是可能的(在Java中在运行时添加CamelRoute)。是这样吗?还是我只是想用骆驼的方式来使用它?

共有1个答案

宋稳
2023-03-14

您可以动态添加路由到您的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中是如何完成的。阿帕奇。骆驼模型常规定义。adviceWith(ModelCamelContext,RouteBuilder)

 类似资料:
  • 问题内容: https://jsfiddle.net/techboy0007/j1eas924/ https://i.stack.imgur.com/KXFot.png 问题答案: 您可以通过反应状态来实现。在您的情况下,您正在使用嵌套对象,因此在更新它们时需要格外小心。 突变您的想法不是一个好主意,因为它很容易导致错误或意外行为。 仔细查看这些功能的工作方式。 在这里,您有一个现场演示。 PD:

  • 假设我的下一个XML来自Oracle队列到驼峰路径: 我想在我的路线中处理这个交换主体,并删除一些元素,例如,然后继续处理主体: 最简单的方法是什么?当然,可以通过声明一些bean或Camel处理器来完成,该处理器将主体作为XML封送/解封送并返回。 但是我想知道骆驼是否有另一种方法?

  • 我使用创建了一个引导式侧边栏。以下是我的代码片段: 我想在包装元素

  • 这个所属公司里面我想动态添加几个从接口获取的二级行业并且生成对应的路由点击跳转不同的页面,这个在vue3和vite项目中要怎么实现呢 就比如这种效果 我想的是先通过rouer.option.route获取route,然后再拿到这个所属公司这个route,其次再获取接口拿到接口数据,通过addroute添加进去路由里面,然后我试了下这个方案不太行,而且会重复添加,我也不能设置一个变量去防止他重复添加

  • 问题内容: 如果我有一个定义如下的函数: 有没有一种方法可以动态地将此函数添加为芹菜PeriodicTask并在运行时启动它?我希望能够做类似(伪代码)的事情: 我还想用(pseudocode)之类的东西动态地停止或删除该任务: 要么 仅供参考,我不使用djcelery,它使您可以通过django管理员管理定期任务。 问题答案: 不,对不起,常规的芹菜拍不可行。 但是做您想要的事情很容易扩展,例如