You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:39:02