關(guān)于springboot2整合lettuce啟動卡住問題的解決方法
前言
EasyCache升級兼容 Springboot2,有個業(yè)務(wù)系統(tǒng)啟動總是會卡住,最后拋出超時異常,如下:
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。
分析原因
如果是線上發(fā)生這個問題會使用 jstack 查看線程的情況,在本地idea調(diào)試就更加方便了,查看線程發(fā)現(xiàn)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的時候沒有釋放鎖。在這地方打斷點發(fā)現(xiàn)是 spring-cloud-sleuth 的 SamplerAutoConfiguration獲取bean的時候有鎖沒有釋放。源代碼如下
protected static class RefreshScopedSamplerConfiguration { public Sampler defaultTraceSampler(SamplerProperties config) { return samplerFromProps(config); } }
@RefreshScope 獲取代理類的時候如果是@PostConstruct的方法,bean是加載不到,所以導(dǎo)致一直沒有釋放鎖。所以猜想,容器還沒有啟動完成的時候,有地方調(diào)用了lettuce的Bean,導(dǎo)致循環(huán)依賴。
坑的復(fù)現(xiàn)及解決辦法
運行下面這段代碼,錯誤就出現(xiàn)了,和業(yè)務(wù)系統(tǒng)出現(xiàn)的問題一模一樣,也驗證了上面的猜想。解決辦法是在容器啟動之后在調(diào)用init方法。(實測使用InitializingBean時也會出現(xiàn)該問題)
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); } }
總結(jié)
到此這篇關(guān)于springboot2整合lettuce啟動卡住問題解決的文章就介紹到這了,更多相關(guān)springboot2整合lettuce啟動卡住內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java兩個數(shù)組合并為一個數(shù)組的幾種方法
這篇文章主要給大家介紹了關(guān)于java兩個數(shù)組合并為一個數(shù)組的幾種方法,最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,文中將每種方法都介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07SpringBoot啟動執(zhí)行sql腳本的3種方法實例
在應(yīng)用程序啟動后,可以自動執(zhí)行建庫、建表等SQL腳本,下面這篇文章主要給大家介紹了關(guān)于SpringBoot啟動執(zhí)行sql腳本的3種方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片),文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02Spring與Mybatis相結(jié)合實現(xiàn)多數(shù)據(jù)源切換功能
這篇文章主要介紹了Spring與Mybatis相結(jié)合實現(xiàn)多數(shù)據(jù)源切換功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06Spring Boot中優(yōu)雅的獲取yml文件工具類
今天小編就為大家分享一篇關(guān)于Spring Boot中優(yōu)雅的獲取yml文件工具類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12@Transactional和@DS怎樣在事務(wù)中切換數(shù)據(jù)源
這篇文章主要介紹了@Transactional和@DS怎樣在事務(wù)中切換數(shù)據(jù)源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07