首页 > 解决方案 > 如何在骆驼路线中使用动态或重新启动路线而不停止应用程序

问题描述

我有现有的 Spring Boot 应用程序,它使用 Camel 框架从不同的文件夹中获取数据。所有路由都以类似的方式轮询数据:

from(fileUriWithCurrentDay(path, config.getParams())).routeId(ROUTE_ID)

其中方法定义如下:

public static String fileUriWithCurrentDay(String path, Map<String, String> params) {
path = path.endsWith(SEPARATOR) ? path : path + SEPARATOR;
return "file:" + path + currentDayPath() + fileParams(params);
}

并根据日期返回类似的内容:

c:/test/data/2021/242?noop=true&idempotent=false&autoCreate=false&includeExt=xml&scheduler=spring&scheduler.cron = "0 0 13 ? * *"

cron 设置为每天启动一次。当达到 cron 时间时,路由开始执行其工作并正确完成它。但是在第二天它开始轮询同一个文件夹,例如 242 但它应该是 243。

所以问题是:从端点应该在开始时动态计算。

我已经阅读了关于动态的内容:在 Camel 中,但没有找到任何开箱即用支持此类选项的信息。我尝试使用pollEnrich()计算的标头使用选项,但它似乎不支持动态端点,因为返回下一个错误:

org.apache.camel.ResolveEndpointFailedException 不允许使用带有 ${ } 占位符的动态表达式。使用 fileName 选项设置动态表达式。

路由启动后如何从端点刷新?

我还看到了 2 种可能的解决方案,但不知道它会有所帮助:

  1. 重新启动路由以从端点 uri 重新计算。
  2. 重新启动整个 Camel 上下文。目前所有路线都标记为 Spring @Component

标签: javaspringspring-bootapache-camelspring-camel

解决方案


与其他 EIP 组件不同,routeId 和 from endpoint 中的字符串在路由创建后是固定的(除非您使用另一个 from endpoint url 重新创建路由)。因此,有 2 个可能的方向继续前进。一种方法是使用来自端点 url 的新路由重新创建路由,另一种方法是在组件中查找参数以支持您的操作。

  1. routeId重新创建相同的消费者路线CamelContext

    • 每天触发以下动作(例如使用timer路线)
    • 用于RouteBuilder构建路由配置(具有相同的消费者路由 ID 和来自端点 url 的新路由)
    • 使用具有新路由配置addRoutes的类方法重新创建路由CamelContext
  2. 文件组件中的杠杆filterDirectory作用

    • 将文件路径设置为公共根文件夹(即c:/test/data
    • 启用recursive查找子目录
    • 用于filterDirectory根据simple语言 过滤目录
      • 简单语言文档中,使用简单语言的日期命令java.text.SimpleDateFormat
      • Oracle doc中,SimpleDateFormat确实支持年和年中的日(假设您的示例中的 242 和 243 是年中的日)

免责声明

我以前没用过filterDirectory,方法 2 是从 Camel 文档中推导出来的。


推荐阅读