关于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启动卡住内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot2整合redis使用lettuce连接池的方法(解决lettuce连接池无效问题)

    lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例操作,是线程不安全的),除非使用连接池,为每个Jedis实例增加物理连接.Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问(即多个线程公用一个连接实例,线程安全),同时它是可伸缩的设计,一个连接

  • 关于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客户端没有,所以

  • CentOS 7下MySQL服务启动失败的快速解决方法

    今天,启动MySQL服务器失败,如下所示: [root@spark01 ~]# /etc/init.d/mysqld start Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe&qu

  • Linux服务器tomact 8.0启动慢的完美解决方法

    环境信息: CentOS release 6.8 tomcat-8.0 JDK1.8 一.启动tomcat #sh /root/tomcat-8.0/bin/startup.sh #tailf /root/tomcat-8.0/logs/catalina.out 26-Aug-2017 12:58:31.661 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selec

  • Nginx启动常见错误及解决方法

    重新启动服务器,访问web服务发现无法浏览啦!登陆服务器之后进到nginx使用./nginx -s reload重新读取配置文件,发现报nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)错误,进到logs文件发现的确没有nginx.pid文件 [root@localhost sbin]# ./nginx -s reload nginx: [error]

  • MySQL无法启动、无法停止解决方法(安全设置后容易出现)

    最近在Windows 2003上的MySQL出现过多次正常运行时无法连接数据库故障,现象是无法连接数据库,也无法停止MySQL或重启MYSQL,重启机子也没有效果,由于每次都是草草尝试各种方法搞定即可,一直没有深入研究,下次一定把图和故障现象系统归纳一下.本文先列一下常见的解决方法. 一.确认MYSQL已经配置且正确 重新配置 如果是重新安装的MYSQL,请确认安装后的MYSQL经过第一次配置,否则会缺少my.ini文件,配置方法,可以在安装到最后一步时选择,现在开始配置MYSQL,或在程序组中

  • springBoot项目启动类启动无法访问的解决方法

    网上也查了一些资料,我这里总结.下不来虚的,也不废话. 解决办法: 1.若是maven项目,则找到右边Maven Projects --->Plugins--->run(利用maven启动)则可以加载到webapp资源 2.上面方法治标不治本.在项目的pom文件中添加<bulid>标签标注路径即可,pom.xml后部分代码如下: 刷新maven加载,重启项目.若还是无法访问,重新导入项目 <dependencies> xxxxxxxxxxxx </dependen

  • MySQL常见内存不足启动失败的完美解决方法

    1.启动MySQL时一直不成功,查看错误日志 /var/log/mysql/error.log 2.主要的错误信息有如下几条: [ERROR] InnoDB: mmap(136151040 bytes) failed; errno 12 [ERROR] InnoDB: Cannot allocate memory for the buffer pool [ERROR] InnoDB: Plugin initialization aborted with error Generic error [

  • jupyter notebook内核启动失败问题及解决方法

    当Anconda安装多个python环境时,或者由于多次卸载安装Anaconda时,导致python的kernel内核启动失败问题,使得jupyter notebook不可用.找不到启动文件.还有就是直接复制粘贴别人已经搭建好的环境过来,在kernel.json里面的启动内核环境还是原来的那个路径.如下图所示内核启动失败kernel error 点击原因,你可以看到,系统找不到指定文件的路径 本文的启动内核失败的原因是:直接复制另一台电脑上的环境,结果在kernel.json里的环境路径还是原来

  • MacOS系统下Unity启动黑屏的解决方法

    前言 Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎. 在最新版的MacOS系统上(MacOS High Sierra 10.13.1),安装Unity 5.3.5f1版本,启动直接显示黑屏,没有熟悉的打开工程.登录等界面.第一次碰到这样的画面,有点懵逼.从网上搜索解决方案,有Windows下的方法,但肯定不适用于MacOS. 无奈之下,自己定位问题并

  • Windows下Mysql启动报1067的解决方法

    前几天刚入职安装了一下Mysql刚开始能打开.今天去公司发现启动不了服务报1067错误,在网上查看了一些方法,好多种版本,以下是本人的解决方法: 1.打开运行-事件查看器--Windows日志--应用程序--找错误标志,如下图 由于使用的是安装版本,所以My.ini下的Datadir没有修改,所以报错,启动找不到数据文件,所以需要把my.ini 文件中的Datadir 改成你安装路径下的data文件 然后保存 重启就可以了. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我

随机推荐