Apache Camel assertMockEndpointsSatisfied超时设置不生效问题
问题根因
你设置的2秒Mock断言超时本身是生效的,多等的30秒和断言逻辑无关,是Apache Camel默认的上下文关停超时导致的:
assertMockEndpointsSatisfied(2, TimeUnit.SECONDS)运行时,确实会在2秒节点校验Mock端点的消息是否匹配断言规则,不满足会立刻判定断言失败- 断言失败抛异常后,JUnit会触发Camel上下文关停流程,Camel默认的关停策略会最多等待30秒,给所有正在路由链路中处理的消息(inflight消息)留足执行时间,等超时或者消息处理完才会真正结束测试、抛出失败结果,所以你体感上是等了30秒才看到测试失败。
常见触发原因
- 路由里存在卡住的未完成消息:比如路由定义里加了
delay()延迟、threads()异步逻辑、阻塞IO调用没返回,或者消息处理抛异常后没被正确捕获,导致消息一直卡在处理中状态,关停时要等它跑完。 - 代码笔误导致路由拓扑异常:你贴的
createRouteBuilder方法里,实例化的路由对象是myRoute,最后返回的却是未定义的inputRoute,如果实际代码真这么写,会导致消息投递路径错误,到不了Mock端点,一直卡在链路里。 - 未自定义测试环境的关停配置:不管是用
CamelTestSupport基类还是@CamelSpringBootTest注解,默认关停超时都是30秒,没改的话就会触发这个等待。 - 路由逻辑不匹配断言规则:你测试里发的消息是String类型,断言要求消息体是
MyObject类型,如果路由里没有对应的类型转换逻辑,也会导致消息处理失败卡在链路里。
修复方法
- 调小测试环境的关停超时,避免无意义等待
可以在测试的配置文件里加参数:
也可以直接在测试类里给Camel上下文设置关停策略,超时直接强制中断卡住的消息:# 关停超时和断言超时对齐,设为2秒 camel.springboot.shutdown-timeout=2s@BeforeEach void configShutdown() { camelContext.getShutdownStrategy().setTimeout(2); camelContext.getShutdownStrategy().setTimeUnit(TimeUnit.SECONDS); camelContext.getShutdownStrategy().setShutdownNowOnTimeout(true); } - 修正代码笔误,
createRouteBuilder方法最后要返回你配置好输入输出端点的myRoute实例,不要返回不存在的inputRoute。 - 排查路由逻辑:确认没有死循环、长阻塞的处理逻辑,如果你确实要把String转成
MyObject,补全对应的类型转换逻辑,让消息能正常流转到Mock端点,不会卡在处理链路里。
内容的提问来源于stack exchange,提问作者Abdelghani Roussi
相关产品推荐
相关产品推荐

