Spring boot 集成Redis客户端Lettuce,导致服务线程数不断增加

概述

最近在部署web 项目时突然发现项目服务停止,经过排查得知服务启动后线程数在不断增加,从而导致集群资源不够,服务停止。

环境

Spring boot:2.1.6
Redis:4.0.8
jdk:1.8

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.5.RELEASE</version>

原因排查

  1. 服务启动后观察查看线程数
pstree -p pid|wc -l
  1. 发现线程数一直再增加,此时查看该进程的堆栈信息
jstack pid|tee -a /opt/1-3.log 
  • 堆栈信息
"lettuce-epollEventLoop-4-3" #509 daemon prio=5 os_prio=0 tid=0x00007f2b6c011000 nid=0x1cde runnable [0x00007f2e86aeb000]
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait0(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:114)
	at io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:256)
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:281)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

"lettuce-timer-3-1" #29 prio=5 os_prio=0 tid=0x00007f2e7804e800 nid=0x1cdd waiting on condition [0x00007f2e86ced000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at io.netty.util.HashedWheelTimer$Worker.waitForNextTick(HashedWheelTimer.java:579)
	at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:478)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

从堆栈信息中我们可以看出出现了很多lettuce线程,此时差不多应该定位到了应该是spring boot集成redis出现的问题了。
当时为了解决问题发布上线进行了如下配置:

#连接池中的最大空闲连接
#spring.redis.lettuce.pool.max-idle=5
#连接池最大连接数
#spring.redis.lettuce.pool.max-active=8
#连接池中的最小空闲连接
#spring.redis.lettuce.pool.min-idle=1

并且服务重启,线程数不会增加。

虽然问题解决但是但是但是,坑的地方也在在此。本质并没有找到。。。

后面服务正常后把配置注释,线程数也不会增加了。说明并不是因为配置了lettuce.pool相关信息解决问题。
目前还没有还原当时的场景 。

<think>嗯,用户遇到了Java应用程序启动时找不到主类的问题,具体是java.lang.ClassNotFoundException: com.example.demo.DemoApplication。我需要根据提供的引用内容来整理解决方案。首先,引用[1]、[2]、[3]都提到了类似的问题,可能的原因包括类路径错误、包名拼写错误、Maven配置问题等。 首先,用户应该检查主类的包路径是否正确。比如,主类DemoApplication应该在com.example.demo包下,代码中的package声明必须一致。引用[2]提到从SVN拉取项目时遇到类似问题,可能是因为IDE没有正确识别项目结构,导致类路径错误。这时候需要检查项目的设置,确保源代码目录正确标记。 接下来,Maven或Gradle的依赖和构建配置也是常见的问题点。引用[3]中提到需要在pom.xml中添加spring-boot-maven-plugin插件,并执行repackage目标。用户可能需要重新生成依赖,运行mvn clean install或gradle build命令,确保生成正确的jar包。有时候IDE的缓存问题也会导致类找不到,清理并重新构建项目可能会有帮助。 另外,检查运行配置是否正确。比如在IntelliJ IDEA中,运行配置里的主类路径是否正确,是否指定了正确的模块。引用[2]的解决方案是通过命令行执行mvn命令来重新生成项目结构,这可能适用于因IDE配置错误导致的问题。 还有可能的问题包括项目结构不正确,比如源代码没有放在src/main/java下,或者编译输出路径设置错误。用户需要确认项目结构符合Maven或Gradle的标准,必要时重新导入项目。 最后,如果所有配置都正确,但问题依然存在,可能需要检查环境变量或JDK版本是否兼容。例如,JDK版本与Spring Boot版本不匹配,或者环境变量中的CLASSPATH设置有误。 总结起来,解决方案应该分步骤,涵盖检查包名、构建工具配置、IDE设置、项目结构、清理缓存等方面,并结合用户提供的引用中的具体方法,比如添加插件、执行Maven命令等。确保用户能逐步排查问题,找到根本原因。</think>### Java应用程序启动时找不到主类的解决方案 #### 1. **检查类路径和包声明** - **确认主类路径**:确保主类`DemoApplication`的完整包路径与代码中的`package`声明一致。例如: ```java package com.example.demo; //必须与实际目录结构匹配 public class DemoApplication { public static void main(String[] args) {...} } ``` - **检查目录结构**:源代码应位于`src/main/java/com/example/demo/`目录下[^2]。 #### 2. **Maven/Gradle配置修复** - **添加Spring Boot插件**(Maven): ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> <!-- 确保生成可执行JAR --> </goals> </execution> </executions> </plugin> ``` 引用示例[^3]。 - **重新生成依赖**: ```bash mvn clean install # Maven ./gradlew build # Gradle ``` #### 3. **IDE配置修复** - **清理缓存并重新构建**: - IntelliJ IDEA:`File > Invalidate Caches / Restart` - Eclipse:`Project > Clean` - **检查运行配置**: - 确认运行配置中的主类路径为`com.example.demo.DemoApplication`。 - 确保模块依赖正确(IntelliJ IDEA中需指定模块)。 #### 4. **项目结构验证** - **标记源代码目录**:在IDE中右键`src/main/java`目录,标记为`Sources Root`。 - **检查编译输出路径**:确保编译后的`.class`文件生成到`target/classes`(Maven)或`build/classes`(Gradle)。 #### 5. **命令行测试** ```bash mvn spring-boot:run # 直接通过Maven插件启动 java -jar target/demo-0.0.1-SNAPSHOT.jar # 运行生成的JAR ``` 若命令行成功,则问题可能出在IDE配置[^2]。 #### 6. **检查依赖冲突** - 执行`mvn dependency:tree`查看依赖树,排除重复或冲突的库。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值