近期在项目中加入了一个redisson分布式锁解决 业务锁定积分的问题。由于此前该项目并没有redisson相关的jar包而且该项目属于老项目 没有使用maven构建依赖,所以需要手动将jar包引入,我在maven网站中下载了相关的redisson jar包,但是使用的时候会出现找不到类的问题,后来索性直接自己在idea中使用maven打包了一个jar包,该jar包包含了io等文件夹,会解决我上述的问题。
这个时候我将在本地开发环境调试,并没有出现任何问题。但是当我把服务升到linux测试环境的时候,出现了问题,就是我启动服务是正常的,但是关闭服务后,服务会有线程关闭不了,导致服务占用端口,再次启动服务的时候会启动不了,需要手动kill进程才可行。如下
一开始以为我自己打包的jar包出现了问题,所以排查方向一直在这上面,没有结果,后面觉得可能是服务启动的时候开启了相关线程,但是在结束的时候没关掉它
代码如下
于是找了相关资料,也问了热心人士,才知道
这个错误提示是因为应用在启动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") 也是可以解决问题的。
就此记录一下问题。