关于springboot2整合lettuce启动卡住问题的解决方法

 更新时间:2021年12月26日 15:36:00   作者:人淡如菊  
Lettuce和Jedis的都是连接Redis Server的客户端程序,下面这篇文章主要给大家介绍了关于springboot2整合lettuce启动卡住问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

EasyCache升级兼容 Springboot2,有个业务系统启动总是会卡住,最后抛出超时异常,如下:

java.util.concurrent.TimeoutException: null

	at java.util.concurrent.FutureTask.get(FutureTask.java:205)

.....

springboot 版本是 2.2.x,springCloudVersion 版本是 2.2.x, lettuce版本是5.2.x,如果使用jedis客户端没有,所以问题一定是出在lettuce。

分析原因

如果是线上发生这个问题会使用 jstack 查看线程的情况,在本地idea调试就更加方便了,查看线程发现lettuce的线程被Blocked,dump出的部分信息如下:

"lettuce-kqueueEventLoop-7-1@14257" daemon prio=5 tid=0x4c nid=NA waiting for monitor entry

  java.lang.Thread.State: BLOCKED

 waiting for main@1 to release lock on <0x38a5> (a java.util.concurrent.ConcurrentHashMap)

  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)

  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)

  ....

看第一行的报错是在获取Bean的时候阻塞了,说明有地方获取Bean的时候没有释放锁。在这地方打断点发现是 spring-cloud-sleuth 的 SamplerAutoConfiguration获取bean的时候有锁没有释放。源代码如下

protected static class RefreshScopedSamplerConfiguration {
	public Sampler defaultTraceSampler(SamplerProperties config) {
		return samplerFromProps(config);
	}
}

@RefreshScope 获取代理类的时候如果是@PostConstruct的方法,bean是加载不到,所以导致一直没有释放锁。所以猜想,容器还没有启动完成的时候,有地方调用了lettuce的Bean,导致循环依赖。

坑的复现及解决办法

运行下面这段代码,错误就出现了,和业务系统出现的问题一模一样,也验证了上面的猜想。解决办法是在容器启动之后在调用init方法。(实测使用InitializingBean时也会出现该问题)

public class SpringDataTestService {
    private StringRedisTemplate stringRedisTemplate;
    //@EventListener(MainContextRefreshedEvent.class)
    public void init() {
        String s = stringRedisTemplate.opsForValue().get("gateway:ab-test:config");
        System.out.println(s);
    }
} 

总结

到此这篇关于springboot2整合lettuce启动卡住问题解决的文章就介绍到这了,更多相关springboot2整合lettuce启动卡住内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java sftp下载文件报错Caused by:com.jcraft.jsch.JSchException:session is down问题

    java sftp下载文件报错Caused by:com.jcraft.jsch.JSchExcep

    文章讲述了作者在日常工作中遇到的JSch连接问题,经过分析发现是由于连接泄露导致的,作者提出了解决方案,并给出了使用建议:1.在finally代码块中关闭连接;2.在真正使用阶段再创建连接,避免创建后不使用又忘记关闭连接
    2024-11-11
  • Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    这篇文章主要为大家详细介绍了Java语言实现简单FTP软件,FTP连接管理模块的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 全面了解OAuth 2.0四种授权方式金三银四无惧面试

    全面了解OAuth 2.0四种授权方式金三银四无惧面试

    这篇文章主要介绍了全面了解OAuth 2.0四种授权方式金三银四无惧面试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java的synchronized关键字深入解析

    Java的synchronized关键字深入解析

    这篇文章主要介绍了Java的synchronized关键字深入解析,在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,需要的朋友可以参考下
    2023-12-12
  • springboot自定义配置及自定义对象映射的全流程

    springboot自定义配置及自定义对象映射的全流程

    这篇文章主要介绍了springboot自定义配置及自定义对象映射的全流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java虚拟机使用jvisualvm工具远程监控tomcat内存

    Java虚拟机使用jvisualvm工具远程监控tomcat内存

    这篇文章主要介绍了Java虚拟机使用jvisualvm工具远程监控tomcat内存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • spring使用aspect注解切面不起作用的排查过程及解决

    spring使用aspect注解切面不起作用的排查过程及解决

    这篇文章主要介绍了spring使用aspect注解切面不起作用的排查过程及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java集合系列之LinkedHashMap源码分析

    Java集合系列之LinkedHashMap源码分析

    这篇文章主要为大家详细介绍了Java集合系列之LinkedHashMap源码分析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • JavaWeb Maven详解相关配置

    JavaWeb Maven详解相关配置

    这篇文章主要介绍了使用maven架构管理开发的相关配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Flink ExecutionGraph生成源码解析

    Flink ExecutionGraph生成源码解析

    这篇文章主要为大家介绍了Flink ExecutionGraph生成源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论