从Spring Boot 2.4.13升级到2.5.14时Elasticsearch异常问题
环境版本信息
o.s.d.e.support.VersionInfo.logVersions - Version Spring Data Elasticsearch: 4.2.11 o.s.d.e.support.VersionInfo.logVersions - Version Elasticsearch Client in build: 7.12.1 o.s.d.e.support.VersionInfo.logVersions - Version Elasticsearch Client used: 7.12.1
报错详情
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is java.lang.RuntimeException: Request execution cancelled
问题分析与解决方向
这个报错核心是Spring Data Elasticsearch在初始化SimpleElasticsearchRepository时,发起的ES请求被取消了。虽然Spring Data Elasticsearch 4.2.11与ES客户端7.12.1的版本匹配合规(Spring Data ES 4.2系列对应ES 7.12.x),但问题大概率出在客户端配置变更、连接超时或者初始化逻辑冲突上,下面是具体的排查和解决方法:
调整ES客户端超时配置
Spring Boot 2.5对ES客户端的默认超时参数做了调整,默认时长可能不足以应对网络延迟或集群负载较高的场景。在配置文件中明确设置更长的超时时间:spring.elasticsearch.rest.connection-timeout=30000 spring.elasticsearch.rest.read-timeout=30000单位为毫秒,以上配置为30秒,可根据实际集群状态调整。
校验ES集群状态与网络连通性
先确认应用服务器能正常访问ES集群节点,ES集群本身处于健康状态(可通过GET _cluster/health接口查看)。如果集群未就绪或网络不通,仓库初始化时获取索引元数据的请求会被取消,进而触发该异常。适配Spring Boot 2.5的ES自动配置逻辑
Spring Boot 2.5优化了RestHighLevelClient的自动配置流程,如果项目中有自定义的ES客户端Bean,需检查是否与新版本自动配置存在冲突。确保客户端Bean在仓库初始化前完全就绪,必要时可使用@DependsOn注解明确依赖顺序。重构仓库初始化逻辑
若自定义Repository或SimpleElasticsearchRepository子类的构造函数中包含ES查询操作,升级后可能因客户端未完成初始化就发起请求导致取消。建议将这类初始化逻辑迁移到@PostConstruct注解标记的方法中,等待Bean完全初始化后再执行。临时降级Spring Data Elasticsearch版本(不推荐长期使用)
如果以上方案无法快速解决问题,可临时在依赖配置中锁定Spring Data Elasticsearch版本为4.1.x系列(对应Spring Boot 2.4版本),先保证服务可用,再逐步排查适配新版本的问题。
内容的提问来源于stack exchange,提问作者pujan kc

