欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

問題1

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

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

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

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

}

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

為了給其它使用到RedissonClient,作為屬性初始化時候不報錯

@Configuration
public class RedissonConfig {

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

}

?????3)項目啟動完成使用一個監(jiān)聽事件

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

/**
 * @ClassName ApplicationLoadRedissonListener
 * @Decription 項目啟動完成,增加一個監(jiān)聽器,替換spring容器里面的redissonClient的對象,進(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實現(xiàn)對象:{}", redissonClient.getClass().getName());;

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

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

}
# redisson 連接配置
# 單個連接最大訂閱數(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é)

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

相關(guān)文章

  • 使用spring工廠讀取property配置文件示例代碼

    使用spring工廠讀取property配置文件示例代碼

    這篇文章主要介紹了使用spring工廠讀取property配置文件示例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java外部類與內(nèi)部類的關(guān)系詳解

    java外部類與內(nèi)部類的關(guān)系詳解

    本文詳細(xì)講解了java外部類與內(nèi)部類的關(guān)系,用代碼演示了外部類調(diào)用內(nèi)部類的方法。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 帶你輕松搞定Java面向?qū)ο蟮木幊?-數(shù)組,集合框架

    帶你輕松搞定Java面向?qū)ο蟮木幊?-數(shù)組,集合框架

    Java是面向?qū)ο蟮母呒壘幊陶Z言,類和對象是 Java程序的構(gòu)成核心。圍繞著Java類和Java對象,有三大基本特性:封裝是Java 類的編寫規(guī)范、繼承是類與類之間聯(lián)系的一種形式、而多態(tài)為系統(tǒng)組件或模塊之間解耦提供了解決方案
    2021-06-06
  • 淺談SpringBoot集成Quartz動態(tài)定時任務(wù)

    淺談SpringBoot集成Quartz動態(tài)定時任務(wù)

    這篇文章主要介紹了SpringBoot集成Quartz動態(tài)定時任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 基于Java實現(xiàn)遍歷文件目錄并去除中文文件名

    基于Java實現(xiàn)遍歷文件目錄并去除中文文件名

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實現(xiàn)遍歷文件目錄并去除中文文件名,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-03-03
  • java如何調(diào)用Groovy腳本

    java如何調(diào)用Groovy腳本

    這篇文章主要介紹了java如何調(diào)用Groovy腳本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 如何解決SpringBoot 加入AOP后無法注入的問題

    如何解決SpringBoot 加入AOP后無法注入的問題

    這篇文章主要介紹了如何解決SpringBoot 加入AOP后無法注入的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值

    使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值

    這篇文章主要介紹了使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • spring bean標(biāo)簽的primary屬性用法講解

    spring bean標(biāo)簽的primary屬性用法講解

    這篇文章主要介紹了spring bean標(biāo)簽的primary屬性用法講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JWT全面解讀和詳細(xì)使用步驟

    JWT全面解讀和詳細(xì)使用步驟

    這篇文章全面解讀了JWT規(guī)范和詳細(xì)使用步驟,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論