近期在项目中加入了一个redisson分布式锁解决 业务锁定积分的问题。由于此前该项目并没有redisson相关的jar包而且该项目属于老项目  没有使用maven构建依赖,所以需要手动将jar包引入,我在maven网站中下载了相关的redisson jar包,但是使用的时候会出现找不到类的问题,后来索性直接自己在idea中使用maven打包了一个jar包,该jar包包含了io等文件夹,会解决我上述的问题。

这个时候我将在本地开发环境调试,并没有出现任何问题。但是当我把服务升到linux测试环境的时候,出现了问题,就是我启动服务是正常的,但是关闭服务后,服务会有线程关闭不了,导致服务占用端口,再次启动服务的时候会启动不了,需要手动kill进程才可行。如下

redisson分布式锁秒杀 redisson分布式锁缺点_jar包

 一开始以为我自己打包的jar包出现了问题,所以排查方向一直在这上面,没有结果,后面觉得可能是服务启动的时候开启了相关线程,但是在结束的时候没关掉它

代码如下

redisson分布式锁秒杀 redisson分布式锁缺点_redis_02

于是找了相关资料,也问了热心人士,才知道 

这个错误提示是因为应用在启动Redisson的时候创建了一个线程,但是在关闭应用时,这个线程没有被正确停止,因此被认为是潜在的内存泄漏。

可以在关闭应用程序之前显式地关闭 Redisson 客户端,这样就可以保证所有 Redisson 客户端中的资源都被正确地关闭了。在你的代码中加入一个@PreDestroy注解的方法,这个方法将在程序关闭时自动调用,可以在这个方法中关闭

@Configuration
public class RedisConfig{
    
    // ...其他配置
    
    private RedissonClient redissonClient;
    
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port);
        redissonClient = Redisson.create(config);
        return redissonClient;
    }

    @PreDestroy
    public void shutdownRedissonClient() {
        redissonClient.shutdown();
    }
}

以上是大佬给出的解决办法,而我自己在大佬回答问题之前  直接在@Bean后面加了个(destroyMethod = "shutdown")  也是可以解决问题的。

就此记录一下问题。