首页 > 数据库 >【转】[Java]引入Redisson可能会出现项目启动失败问题解决

【转】[Java]引入Redisson可能会出现项目启动失败问题解决

时间:2024-03-06 22:45:28浏览次数:17  
标签:Redisson Java spring redis singleServerConfig serverConfig redissonClient rediss

转自:https://blog.csdn.net/bengbuguang4321/article/details/121951650

在启动项目时,Redisson 自己会启动一个Redisson连接池,尝试连接redis,这时候如果遇到网络不通就会出现问题,因为redis连接不上,导致项目启动不了

解决方法是:

1、重新空实现了一个RedissonClient

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

2、然后将这个空实现注入到spring容器

@Configuration
public class RedissonConfig {
    /**
     * 配置一个临时的对象到spring容器中,不使用
     * @return 一个RedissonClient的实现
     */
    @Bean
    public RedissonClient redissonClient() {
        RedissonClient redissonClient = new RedissonClientTemporary();
        return redissonClient;
    }
}

3、在项目启动后使用监听事件,放入Redisson替换RedissonClient的实现,然后初始化一下

注:这里可能还是会连接报错,但是项目已经启动,这里再连接报错的话可以考虑重试机制等补偿方案

/**
 * @ClassName ApplicationLoadRedissonListener
 * @Decription 项目启动完成,增加一个监听器,替换spring容器里面的redissonClient的对象,进行切换成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基础配置
            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实现对象:{}", redissonClient.getClass().getName());;
 
            //创建一个Redisson对象
            BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) configurableApplicationContext;
            beanDefinitionRegistry.registerBeanDefinition(redissonClientName, beanDefinitionBuilder.getBeanDefinition());
 
            //这里相当于初始化加载使用
            redissonClient = configurableApplicationContext.getBean(redissonClientName);
            log.info("最终放入的redissonClient实现对象:{}", redissonClient.getClass().getName());
        }catch (Exception e){
            log.info("ApplicationLoadRedissonListener/onApplicationEvent/RedissonClient/Exception:[{}]", e.getMessage());
        }
    } 
}
写在最后: redisson 连接配置
# redisson 连接配置
# 单个连接最大订阅数量
spring.redis.redisson.singleServerConfig.subscriptionsPerConnection=5
# 连接池大小
spring.redis.redisson.singleServerConfig.connectionPoolSize=8
# 最小空闲连接数
spring.redis.redisson.singleServerConfig.connectionMinimumIdleSize=4
# 发布和订阅连接池大小
spring.redis.redisson.singleServerConfig.subscriptionConnectionPoolSize=8
# 发布和订阅连接的最小空闲连接数
spring.redis.redisson.singleServerConfig.subscriptionConnectionMinimumIdleSize=1

 

标签:Redisson,Java,spring,redis,singleServerConfig,serverConfig,redissonClient,rediss
From: https://www.cnblogs.com/z5337/p/18057816

相关文章

  • JAVA API:ArrayList应用案例
    packagecom.itheima.ArrayList;importjava.util.ArrayList;publicclassDemo2{publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<>();list.add("Java入门");list.add("宁夏枸杞&......
  • Java连接PostgreSQL数据库测试
    importjava.sql.DriverManager;importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.ResultSet;importjava.sql.Statement;publicclassPG{publicstaticvoidmain(String[]args){System.out.println("PostgreSQLJDBC......
  • 解析properties文件通用Java工具类
    importcom.sun.xml.internal.bind.v2.TODO;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;imp......
  • Java 枚举(Enums)解析:提高代码可读性与易维护性
    接口在Java中,实现抽象的另一种方式是使用接口。接口定义接口是一个完全抽象的类,用于将具有空方法体的相关方法分组://接口interfaceAnimal{publicvoidanimalSound();//接口方法(没有具体实现体)publicvoidrun();//接口方法(没有具体实现体)}实现接口要访问......
  • 卡码java基础课 | 9.打印正方形
    学习内容:通过一道题目来学习使用循环嵌套。例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();for(intro......
  • java定时任务
    一单机定时任务Timerjava.util.Timer是JDK1.3开始就已经支持的一种定时任务的实现方式。Timer内部使用一个叫做TaskQueue的类存放定时任务,它是一个基于最小堆实现的优先级队列。TaskQueue会按照任务距离下一次执行时间的大小将任务排序,保证在堆顶的任务最先执行。这样......
  • 卡码java基础课 | 8.奇怪的信
    学习内容:通过一道题加深对取模和除法的理解例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);while(sc.hasNext()){intnum......
  • 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位
    说明所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面。究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸,自己当年也是这么过来的。今天我就毕其功于一役,解放大家的时间,让凡人的环境配置见鬼去吧......
  • JAVA API:ArrayList(泛型类)基本使用
    ArrayList代表的是一种集合,一种容器,类似于数组。 容器主要操作:增删改查   packagecom.itheima.ArrayList;importjava.util.ArrayList;importjava.util.List;publicclassdemo{publicstaticvoidmain(String[]args){ArrayListlist=new......
  • 卡码java基础课 | 7.摆平积木
    学习内容:用一道题目来练习ArrayList的遍历和访问操作。例题:解:点击查看代码importjava.util.ArrayList;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);in......