Camel forceShutdown无回滚、不触发onCompletion的文件路由配置问题
解决方案
1. 屏蔽关闭场景的onCompletion回调
Camel的onCompletion默认会在上下文关闭阶段执行,添加allowOnShutdown(false)配置即可让其在服务关闭过程中不触发回调,避免CompletionProcess在ApplicationContext关闭后执行报错。
2. 关闭shutdown超时后的自动回滚逻辑
Camel默认关闭超时后会自动回滚当前正在处理的Exchange,触发错误处理逻辑,文件就会被移动到failedDir目录。修改ShutdownStrategy的rollbackOnShutdown属性为false即可关闭该回滚行为,不会触发文件移动操作。
3. 修正路由配置问题
当前路由存在参数冲突与笔误:
- 代码笔误:
processe应为process,nd()应为end() - 参数分隔符错误:
idempotentRepository=#fileRepo@readLockRemoveOnCommit中的@应为参数分隔符& - 冲突参数:同时配置
noop=true和delete=true属于冲突配置,noop=true会忽略所有源文件修改操作,若业务需要处理完成后删除源文件,直接删除noop=true配置即可 - readLock配置调整:将
readLockRemoveOnRollback改为false,避免回滚时清除文件锁,保留源文件原始状态
4. 完整配置示例
// 全局ShutdownStrategy配置 DefaultShutdownStrategy shutdownStrategy = new DefaultShutdownStrategy(); shutdownStrategy.setTimeout(45); shutdownStrategy.setTimeUnit(TimeUnit.SECONDS); shutdownStrategy.setRollbackOnShutdown(false); camelContext.setShutdownStrategy(shutdownStrategy); // 修正后的路由配置 fromF("file:in?recursive=false&maxMessagePerPoll=10&readLock=idempotent&idempotentRepository=#fileRepo&readLockRemoveOnCommit=true&readLockRemoveOnRollback=false&delete=true&moveFailed=failedDir") .onCompletion() .allowOnShutdown(false) .process("CompletionProcess") .end() .threads(5) .process("fileProcess") .end();
以上配置生效后,服务收到关闭信号等待45秒超时后,会触发强制关闭,不会执行onCompletion回调,也不会触发回滚逻辑,源文件会保留在原始目录不变。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

