java - 如何在骆驼路线中使用动态或重新启动路线而不停止应用程序
问题描述
我有现有的 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 种可能的解决方案,但不知道它会有所帮助:
- 重新启动路由以从端点 uri 重新计算。
- 重新启动整个 Camel 上下文。目前所有路线都标记为 Spring
@Component
。
解决方案
与其他 EIP 组件不同,routeId 和 from endpoint 中的字符串在路由创建后是固定的(除非您使用另一个 from endpoint url 重新创建路由)。因此,有 2 个可能的方向继续前进。一种方法是使用来自端点 url 的新路由重新创建路由,另一种方法是在组件中查找参数以支持您的操作。
routeId
重新创建相同的消费者路线CamelContext
- 每天触发以下动作(例如使用
timer
路线) - 用于
RouteBuilder
构建路由配置(具有相同的消费者路由 ID 和来自端点 url 的新路由) - 使用具有新路由配置
addRoutes
的类方法重新创建路由CamelContext
- 每天触发以下动作(例如使用
文件组件中的杠杆
filterDirectory
作用- 将文件路径设置为公共根文件夹(即
c:/test/data
) - 启用
recursive
查找子目录 - 用于
filterDirectory
根据simple
语言 过滤目录- 从简单语言文档中,使用简单语言的日期命令
java.text.SimpleDateFormat
- 从Oracle doc中,
SimpleDateFormat
确实支持年和年中的日(假设您的示例中的 242 和 243 是年中的日)
- 从简单语言文档中,使用简单语言的日期命令
- 将文件路径设置为公共根文件夹(即
免责声明
我以前没用过filterDirectory
,方法 2 是从 Camel 文档中推导出来的。
推荐阅读
- c# - EF - 使用带有 where 子句的控制器的 Id 参数加入查询
- html - 图标在选项元素内未正确显示
- java - 我删除了适配器中的一些项目,并且在我的 setOnClick 崩溃之后
- lua - 如何让 LUA 在 VSCode 中工作,使其运行到输出窗口?
- .net - 如何在 .NET 安装执行重新启动后强制 Windows 启动我自己的 MSI?
- java - 是否可以从 Spring Boot 应用程序压缩嵌入式 HSQL DB?
- sql - 如何停止获取错误并保留数据:缺少换行符:在位置 116 发现意外字符 0x31
- python - 在循环内使用 repl_python()
- asynchronous - F# 异步相当于 Promise.race?
- java - 如何将弧度转换为度数