基于Spring Cloud的应用启动偶发ConcurrentModificationException如何修复
问题根因
该并发修改异常是spring-cloud-function-context 3.1.3版本的已知缺陷:SimpleFunctionRegistry类中存储函数注册信息的functionRegistrations是普通HashMap类型,未做并发安全控制。应用启动阶段一边注册Function Bean、一边收到请求遍历查找函数时,就会触发并发修改异常,导致请求失败、消息丢失。
修复方案
方案1:升级依赖版本(最推荐)
该缺陷已在后续补丁版本中修复,可直接将spring-cloud-starter-function-web的版本升级到3.1.7及以上的3.1.x维护版本,该版本和你当前使用的Spring Boot 2.5.4完全兼容,无需修改业务代码。新版本官方已将functionRegistrations替换为ConcurrentHashMap,从根源解决并发安全问题。
方案2:临时规避(无法升级版本时使用)
- 延后流量接入时机:配置Spring Boot就绪检查,等所有Bean初始化完成、应用完全启动后再对外接入流量,比如K8s环境下配置
readinessProbe校验/actuator/health接口返回UP之后再转发请求,避免启动阶段的并发读写冲突。 - 配置函数预加载:在配置文件中添加如下配置,强制应用启动时就初始化所有Function Bean,避免运行时动态查找触发并发问题:
spring: cloud: function: eager: true
内容的提问来源于stack exchange,提问作者Mathias CARVILLE
相关产品推荐
相关产品推荐

