关于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启动卡住内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://www.panaihua.com/lettuce-blocked/
相关文章
ThinkPhP+Apache+PHPstorm整合框架流程图解
这篇文章主要介绍了ThinkPhP+Apache+PHPstorm整合框架流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-23- 这篇文章给大家介绍了MAVEN的安装,配置与IDEA整合方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧...2021-02-06
- 这篇文章主要介绍了SpringBoot2 Jpa 批量删除功能的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
- 本文给大家推荐的是使用angularjs实现整合微信新推出的UI(weui)的全部过程,有相同需求的小伙伴可以参考下...2016-03-18
Springboot使用Spring Data JPA实现数据库操作
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作...2021-06-30- 这篇文章主要介绍了Springboot整合quartz产生错误及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-03
- 这篇文章主要介绍了关于springboot整合swagger问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-20
java、spring、springboot中整合Redis的详细讲解
这篇文章主要介绍了java、spring、springboot中整合Redis的详细讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-02- JWT全称是json web token,它将用户信息加密到 token 里,服务器不保存任何用户信息,服务器通过使用保存的密钥验证 token 的正确性,只要正确即通过验证,这篇文章主要给大家介绍了关于SpringBoot整合JWT的相关资料,需要的朋友可以参考下...2021-06-29
Springboot jdbctemplate整合实现步骤解析
这篇文章主要介绍了Springboot jdbctemplate整合实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-26- shiro可以直接和spring整合,但是这样需要单独配置spring用于整合shiro,在配置springmvc,接下来通过实例代码给大家介绍shiro 整合 SpringMVC 的方法,感兴趣的朋友一起看看吧...2021-08-14
- 在为用户提供动态内容方面,PHP和MySQL是一个强大的组合。这些年来,这两项产品已经跨越了它们最初的应用舞台,现在,一些世界上最繁忙的网站也在应用它们。虽然它们当初都是...2016-11-25
帝国CMS整合Discuz!7.2方法,完整双向同步登录退出
用帝国CMS6.6整合安装Discuz!7.2。为了便于以后的升级扩展。决定整合ucenter1.5 首先安装 “Discuz_7.2_FULL_SC_GBK”也就是已经包含ucenter1.5的Discuz7.2版本...2016-05-19- 这篇文章主要给大家介绍了关于.net core整合log4net的解决方案,文中通过图文介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
win7下Apache2.2+Tomcat7.0整合配置详解
这篇文章主要介绍了win7下Apache2.2+Tomcat7.0整合配置详解,需要的朋友可以参考下...2016-11-01绝对易用的php/mysql/apache整合环境:EasyPHP
绝对易用的php/mysql/apache整合环境: EasyPHP EasyPHP 1.5 17/08/2001 Nouvelle version avec : apache 1.3.20 - php 4.0.6 - mysql 3.23.40 - phpmyadmin 2.2.0rc4...2016-11-25- 这篇文章主要介绍了SpringBoot2 JPA解决懒加载异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
- 这篇文章主要介绍了SpringBoot框架整合Mybatis的简单攻略,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2021-10-15
springboot2.3 整合mybatis-plus 高级功能及用法详解
这篇文章主要介绍了springboot2.3 整合mybatis-plus 高级功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-03- 例子:我们要整合下面三个帝国CMS系统 网站名称分别为“A网站”、“B网站”、“C网站”; 安装系统的数据库名分别为“adb”、“...2015-12-30