关于springboot2整合lettuce启动卡住问题的解决方法
作者:人淡如菊 发布时间:2022-08-24 09:29:16
前言
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);
}
}
来源:https://www.panaihua.com/lettuce-blocked/


猜你喜欢
- jackson反序列化忽略字段JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有
- 我们开启一个线程,线程每隔一秒发送一次消息,我们在消息中更新TextView上显示的时间就ok了。首先我们在布局文件中放一个TextView
- 登录添加验证码是一个非常常见的需求,网上也有非常成熟的解决方案,其实,要是自己自定义登录实现这个并不难,但是如果需要在 Spring Sec
- /* * Copyright 2012-2013 The Haohui Network Cor
- swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图:并且可以设置窗体背景图片的透明度下
- 1、在build.gradle(Module)里引入依赖,然后重构(sync Now):android { ...
- 用微信提供的SDK来实现分享:从http://open.weixin.qq.com下载Android相关的jar包,将libammsdk.j
- Java提供了许多创建线程池的方式,并得到一个Future实例来作为任务结果。对于Spring同样小菜一碟,通过其scheduling包就可
- 前言大家应该都用过synchronized 关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什
- 引言在Flutter开发中,所有的组件和页面都继承自Widget,所以探索页面的生命周期其实就是Widget的生命周期。 在 Flutter
- 本文实例讲述了Android使用httpPost向服务器发送请求的方法。分享给大家供大家参考,具体如下:import java.util.L
- 克隆,想必大家都有耳闻,世界上第一只克隆羊多莉就是利用细胞核移植技术将哺乳动物的成年体细胞培育出新个体,甚为神奇。其实在Java中也存在克隆
- 导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下。所用技术就是SpringBoot,然后是MVC架
- 排列组合是常见的数学问题,本文就以完整实例形式讲述了C#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下:首先,数学中排列组合
- 一、简介上篇介绍了一个自己做的管理系统,最近空闲的时间自己在继续做,把之前登录时候自定义的 * 过滤器换成了基于SpringSecurity
- 一、Java并发是什么?用学术定义来说就是并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行);简单来说就是,同一个时间段,让计
- 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。深刻认识Stri
- 一、概述Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法
- GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简
- 实践过程效果代码public partial class Form1 : Form{ public Form1()