Spring Integration应用SimpleMessageStore容量不足异常排查求助
问题分析与解决方案
首先,这个异常并非Spring Integration 5.5.10的已知bug,而是由于SimpleMessageStore的容量限制或消息组未及时清理导致的配置类问题——即使业务响应正常,也会因存储临时耗尽触发日志报错。
核心原因
SimpleMessageStore默认构造器的容量是1000(对应源码中new SimpleMessageStore(1000)),而Scatter-Gather组件会为每个请求创建一个消息组来聚合分散调用的结果。如果并发请求数超过存储容量,或者消息组未被及时清理,就会触发容量不足的异常。由于消息组最终会被处理并释放空间,所以业务能正常返回200响应,但存储临时耗尽的过程会被日志记录。
解决方法
1. 显式增大SimpleMessageStore容量
创建自定义的SimpleMessageStore Bean,指定更大的容量,注入到Scatter-Gather组件中:
@Bean public MessageStore simpleMessageStore() { // 根据业务并发量调整容量值,比如10000 return new SimpleMessageStore(10000); } // 在Scatter-Gather配置中引用该Bean .scatterGather(scatterer -> scatterer // 其他配置 .messageStore(simpleMessageStore()) )
2. 配置消息组自动清理机制
如果不想单纯扩容,可通过设置消息组超时+定时清理来释放存储资源:
- 设置消息组超时:
@Bean public MessageStore simpleMessageStore() { SimpleMessageStore store = new SimpleMessageStore(1000); // 设置消息组超时时间(毫秒),比如30秒 store.setGroupTimeout(30000); return store; }
- 启用
MessageGroupStoreReaper定时清理过期消息组:
@Bean public MessageGroupStoreReaper storeReaper(MessageStore simpleMessageStore) { MessageGroupStoreReaper reaper = new MessageGroupStoreReaper(); reaper.setMessageStore(simpleMessageStore); // 每隔1分钟执行一次清理 reaper.setDelay(60000); return reaper; } @Bean public IntegrationFlow reaperFlow(MessageGroupStoreReaper reaper) { return IntegrationFlows.from(() -> "trigger", e -> e.poller(p -> p.fixedDelay(60000))) .handle(reaper) .get(); }
3. 优化Scatter-Gather配置
确保Scatter-Gather的超时设置合理,避免消息组长时间占用存储:
.scatterGather(scatterer -> scatterer // 分散调用配置 .applySequence(true), gatherer -> gatherer // 设置聚合超时时间(毫秒),比如10秒 .timeout(10000) )
版本说明
Spring Integration 5.5.x属于维护分支,该问题在后续更高版本(如6.x)中未被标记为bug,核心解决思路依然是调整存储容量或清理策略,若无需升级版本,按上述配置即可解决日志报错问题。
内容的提问来源于stack exchange,提问作者Sohan Poonia
相关产品推荐
相关产品推荐

