t-crm","weight":1.0}] org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.util.concurrent.RejectedExecutionException: event executor terminated at org.springframework.data.redis.FallbackExceptionTranslationStrategy.getFallback(FallbackExceptionTranslationStrategy.java:53) at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:43) at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:268) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.convertLettuceAccessException(LettuceStringCommands.java:799) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.set(LettuceStringCommands.java:180) at org.springframework.data.redis.connection.DefaultedRedisConnection.set(DefaultedRedisConnection.java:281) at org.springframework.data.redis.connection.DefaultStringRedisConnection.set(DefaultStringRedisConnection.java:955) at org.springframework.data.redis.core.DefaultValueOperations.lambda$setIfAbsent$11(DefaultValueOperations.java:310) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:225) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:185) at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) at org.springframework.data.redis.core.DefaultValueOperations.setIfAbsent(DefaultValueOperations.java:310) at com.springboot.cloud.common.core.util.RedisLock.lock(RedisLock.java:55) at com.taojue.agent.middle.utils.sequences.SequencesProviderImpl.getCode(SequencesProviderImpl.java:304) at com.taojue.agent.middle.utils.sequences.SequencesProviderImpl.getMaihuoDemandCode(SequencesProviderImpl.java:94)
时间: 2025-03-24 07:12:57 浏览: 153
从错误堆栈信息来看,这是一个由Spring Data Redis引发的问题,并最终导致了一个`RejectedExecutionException`异常。以下是详细的分析和解决方案:
---
### 错误原因
1. **核心问题**
`java.util.concurrent.RejectedExecutionException: event executor terminated` 表示事件线程池已经被关闭了(terminated),而此时仍然尝试提交任务到该线程池中运行。
2. **触发场景**
- 可能是因为Redis客户端连接超时或长时间未活动,底层Netty的EventLoopGroup已经终止。
- 或者程序在某些特殊条件下提前关闭了Redis连接资源,例如应用程序意外重启、容器销毁等。
3. **涉及组件**
异常来源于 Spring Data Redis 的 Lettuce 客户端。Lettuce 使用 Netty 作为其异步通信框架,当 Netty 线程池被终止后再发起请求就会抛出此异常。
---
### 解决方案
#### 方法一:检查并优化Redis配置
- 配置合理的空闲连接回收策略,避免连接长时间闲置后失效:
```properties
spring.redis.lettuce.pool.max-idle=10 # 最大空闲连接数
spring.redis.lettuce.pool.min-idle=5 # 最小空闲连接数
spring.redis.timeout=5000ms # 连接超时时间
```
- 增加心跳检测机制以保持长连接有效:
```properties
spring.redis.lettuce.shutdown-timeout=60s # 设置优雅退出等待时间
spring.redis.health-check-interval=10s # 检查健康状态的时间间隔
```
#### 方法二:捕获异常并重试逻辑
针对可能出现的临时网络抖动情况,在业务层增加自动重试功能:
```java
public String getCodeWithRetry() {
int retryCount = 3;
while (retryCount-- > 0) {
try {
return sequencesProvider.getCode(); // 尝试获取序列号
} catch (RedisSystemException e) {
if (!(e.getRootCause() instanceof RejectedExecutionException)) {
throw e; // 如果不是线程池结束异常,则直接抛出其他错误
}
log.warn("Retrying due to connection issue...");
}
}
throw new RuntimeException("Failed after multiple retries.");
}
```
#### 方法三:排查应用上下文是否正常释放资源
确认是否存在服务启动过程中部分依赖加载失败的情况;同时也要留意项目生命周期管理环节是否有不当之处造成过早清理缓存实例或其他共享变量等问题发生。
---
### 总结建议
结合实际生产环境特点综合考虑调整以上几个方面设置值大小即可解决问题。此外还可以通过监控工具定期查看服务器负载状况以及数据库压力水平以便及时发现潜在风险点并采取相应措施予以规避。
---
阅读全文
相关推荐


















