最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決引入Redisson可能會(huì)出現(xiàn)項(xiàng)目啟動(dòng)失敗的問題

 更新時(shí)間:2024年06月12日 10:06:37   作者:瘋狂打碼中~  
這篇文章主要介紹了解決引入Redisson可能會(huì)出現(xiàn)項(xiàng)目啟動(dòng)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問題1

需要注意Redisson版本和spring-boot版本一致,我使用的是spring-boot 2.1.3 對(duì)應(yīng)的Redisson 3.9.1不然會(huì)報(bào)錯(cuò)

java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/RedisStreamCommands

    at org.redisson.spring.data.connection.RedissonConnectionFactory.getConnection(RedissonConnectionFactory.java:111)
    at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
    at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
    at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
    at org.springframework.data.redis.core.RedisTemplate.hasKey(RedisTemplate.java:769)

<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.9.1</version>
        </dependency>

問題2

Redisson自己會(huì)啟動(dòng)一個(gè)Redisson連接池,嘗試連接redis,項(xiàng)目啟動(dòng)的時(shí)候就會(huì)連接,這時(shí)候如果k8s初始化的pod節(jié)點(diǎn)網(wǎng)絡(luò)不通可能會(huì)出現(xiàn)問題,因?yàn)閞edis連接不上(說是我們的是海外服務(wù)器的原因,網(wǎng)絡(luò)不穩(wěn)定),項(xiàng)目報(bào)錯(cuò),導(dǎo)致起不起來,然后pod會(huì)一直重啟,因?yàn)檫\(yùn)維層次不了解他們?cè)O(shè)置的k8s原理,需要在短時(shí)間解決,提供了下面的方案解決,后來也沒有再出現(xiàn)這個(gè)問題,啟動(dòng)報(bào)錯(cuò)

1)自己重新空實(shí)現(xiàn)了一個(gè)RedissonClient

/**
 * @ClassName RedissonClientTemporary
 * @Decription 只是在初始化時(shí)候使用一下,之后就會(huì)被替換
 */
public class RedissonClientTemporary implements RedissonClient{

}

2)然后將這個(gè)空實(shí)現(xiàn)注入到spring容器

為了給其它使用到RedissonClient,作為屬性初始化時(shí)候不報(bào)錯(cuò)

@Configuration
public class RedissonConfig {

    /**
     * 配置一個(gè)臨時(shí)的對(duì)象到spring容器中,不使用
     * @return 一個(gè)RedissonClient的實(shí)現(xiàn)
     */
    @Bean
    public RedissonClient redissonClient() {
        RedissonClient redissonClient = new RedissonClientTemporary();
        return redissonClient;
    }

}

?????3)項(xiàng)目啟動(dòng)完成使用一個(gè)監(jiān)聽事件

放入Redisson替換RedissonClient的實(shí)現(xiàn),然后初始化一下,這里可能還是會(huì)連接報(bào)錯(cuò)但是不影響,因?yàn)橐呀?jīng)放入了spring容器,如果這里連接失敗,他也就不會(huì)再次嘗試連接了,直到你再次使用它時(shí)候才會(huì)再次調(diào)用創(chuàng)建連接(那會(huì)redis就已經(jīng)可用,其實(shí)redis還不可用,我們使用降級(jí)策略也可以,那會(huì)使用本地緩存或者數(shù)據(jù)庫等)

/**
 * @ClassName ApplicationLoadRedissonListener
 * @Decription 項(xiàng)目啟動(dòng)完成,增加一個(gè)監(jiān)聽器,替換spring容器里面的redissonClient的對(duì)象,進(jìn)行切換成redisson
 */
@Component
public class ApplicationLoadRedissonListener implements ApplicationListener<ApplicationReadyEvent> {

    private static final Logger log = LoggerFactory.getLogger(ApplicationLoadRedissonListener.class);

    @Autowired
    ConfigurableApplicationContext configurableApplicationContext;
    @Autowired
    private RedisProperties redisProperties;
    @Value("${spring.redis.redisson.singleServerConfig.subscriptionsPerConnection}")
    private Integer subscriptionsPerConnection;
    @Value("${spring.redis.redisson.singleServerConfig.connectionPoolSize}")
    private Integer connectionPoolSize;
    @Value("${spring.redis.redisson.singleServerConfig.connectionMinimumIdleSize}")
    private Integer connectionMinimumIdleSize;
    @Value("${spring.redis.redisson.singleServerConfig.subscriptionConnectionPoolSize}")
    private Integer subscriptionConnectionPoolSize;
    @Value("${spring.redis.redisson.singleServerConfig.subscriptionConnectionMinimumIdleSize}")
    private Integer subscriptionConnectionMinimumIdleSize;


    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        try{
            //加載一些基本的redis基礎(chǔ)配置
            Config config = new Config();
            String address = "redis://" + redisProperties.getHost() + ":" + redisProperties.getPort();
            SingleServerConfig serverConfig = config.useSingleServer();
            serverConfig.setAddress(address);
            serverConfig.setDatabase(redisProperties.getDatabase());
            if (!StringUtils.isEmpty(redisProperties.getPassword())) {
                serverConfig.setPassword(redisProperties.getPassword());
            }
            serverConfig.setTimeout((int)redisProperties.getTimeout().toMillis());

            //加載redisson一些特殊配置
            serverConfig.setConnectionPoolSize(connectionPoolSize);
            serverConfig.setConnectionMinimumIdleSize(connectionMinimumIdleSize);
            serverConfig.setSubscriptionConnectionMinimumIdleSize(subscriptionConnectionMinimumIdleSize);
            serverConfig.setSubscriptionConnectionPoolSize(subscriptionConnectionPoolSize);
            serverConfig.setSubscriptionsPerConnection(subscriptionsPerConnection);

            log.info("加載 redisson配置信息 {}", JsonUtil.of(serverConfig));
            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Redisson.class);
            beanDefinitionBuilder.addConstructorArgValue(config);

            String redissonClientName = RedissonClient.class.getSimpleName().substring(0,1).toLowerCase() + RedissonClient.class.getSimpleName().substring(1);
            Object redissonClient = configurableApplicationContext.getBean(redissonClientName);
            log.info("初次放入的redissonClient實(shí)現(xiàn)對(duì)象:{}", redissonClient.getClass().getName());;

            //創(chuàng)建一個(gè)Redisson對(duì)象
            BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) configurableApplicationContext;
            beanDefinitionRegistry.registerBeanDefinition(redissonClientName, beanDefinitionBuilder.getBeanDefinition());

            //這里相當(dāng)于初始化加載使用
            redissonClient = configurableApplicationContext.getBean(redissonClientName);
            log.info("最終放入的redissonClient實(shí)現(xiàn)對(duì)象:{}", redissonClient.getClass().getName());
        }catch (Exception e){
            log.info("ApplicationLoadRedissonListener/onApplicationEvent/RedissonClient/Exception:[{}]", e.getMessage());
        }
    }

}
# redisson 連接配置
# 單個(gè)連接最大訂閱數(shù)量
spring.redis.redisson.singleServerConfig.subscriptionsPerConnection=5
# 連接池大小
spring.redis.redisson.singleServerConfig.connectionPoolSize=8
# 最小空閑連接數(shù)
spring.redis.redisson.singleServerConfig.connectionMinimumIdleSize=4
# 發(fā)布和訂閱連接池大小
spring.redis.redisson.singleServerConfig.subscriptionConnectionPoolSize=8
# 發(fā)布和訂閱連接的最小空閑連接數(shù)
spring.redis.redisson.singleServerConfig.subscriptionConnectionMinimumIdleSize=1

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC基于配置的異常處理器

    SpringMVC基于配置的異常處理器

    這篇文章主要為大家介紹了SpringMVC基于配置的異常處理器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • IntelliJ IDEA JRebel 安裝使用圖文教程(熱部署插件)

    IntelliJ IDEA JRebel 安裝使用圖文教程(熱部署插件)

    IDEA 全稱 IntelliJ IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認(rèn)為最好的java開發(fā)工具之一。這篇文章主要介紹了IntelliJ IDEA 熱部署插件JRebel 安裝使用圖文教程,需要的朋友可以參考下
    2018-03-03
  • SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非常基礎(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法

    Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法

    這篇文章主要介紹了Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了Java操作ArrayList自定義排序的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • MyBatis 延遲加載深度解密:從使用方式到底層動(dòng)態(tài)代理原理解析

    MyBatis 延遲加載深度解密:從使用方式到底層動(dòng)態(tài)代理原理解析

    本文詳細(xì)解析MyBatis延遲加載機(jī)制,涵蓋定義、配置方式、底層原理、執(zhí)行流程及常見坑點(diǎn),助你掌握延遲加載優(yōu)化數(shù)據(jù)庫查詢與內(nèi)存使用技巧,應(yīng)對(duì)面試與實(shí)際項(xiàng)目挑戰(zhàn),感興趣的朋友一起看看吧
    2026-06-06
  • Spring中的@Configuration詳解

    Spring中的@Configuration詳解

    這篇文章主要介紹了Spring中的@Configuration詳解,Spring 提供了豐富的特性和功能,包括依賴注入、面向切面編程、事務(wù)管理、數(shù)據(jù)訪問、Web應(yīng)用程序開發(fā)等,需要的朋友可以參考下
    2023-08-08
  • Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    這篇文章主要介紹了Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • 解決IDEA Gradle構(gòu)建報(bào)錯(cuò)''Cause: zip END header not found''

    解決IDEA Gradle構(gòu)建報(bào)錯(cuò)''Cause: zip END header not found''

    這篇文章主要介紹了解決IDEA Gradle構(gòu)建報(bào)錯(cuò)"Cause: zip END header not found"的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作示例

    Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作示例

    這篇文章主要介紹了Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作,結(jié)合實(shí)例形式詳細(xì)分析了Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查基本操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    在做項(xiàng)目中遇到這樣的需求要求每個(gè)賬戶同時(shí)只能有一個(gè)人登錄或幾個(gè)人同時(shí)登錄,如果是同時(shí)登錄的多人,要么不讓后者登錄,要么踢出前者登錄,怎么實(shí)現(xiàn)這樣的功能呢?下面小編給大家?guī)砹藄hiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼,一起看看吧
    2017-09-09

最新評(píng)論

宜川县| 翼城县| 磐石市| 汤阴县| 茶陵县| 台东市| 蚌埠市| 丰原市| 浦东新区| 德昌县| 鄂尔多斯市| 江孜县| 桐庐县| 闸北区| 平凉市| 丹阳市| 天全县| 靖安县| 凤台县| 中方县| 肇州县| 峨眉山市| 三原县| 翁牛特旗| 贵州省| 曲靖市| 临西县| 四会市| 汉川市| 宝兴县| 丘北县| 简阳市| 镇原县| 赣榆县| 武义县| 东山县| 东源县| 蕉岭县| 仙桃市| 泗洪县| 盐城市|