redis报cant resolve localhost address错误

starlin 1,105 2019-08-30

问题描述

最近公司把项目都开源至公司内部的gitlab上面,所有的单元测试都是通过gitlab中的CI脚本来运行的,可是在CI上面跑单元测试时产生如下图错误:

![redis_error](medhttps://raw.githubusercontent.com/smartlin/pic/main/_posts/redis/redis%E4%B8%8D%E8%83%BD%E8%A7%A3%E6%9E%90localhost%E5%9C%B0%E5%9D%80.md/redis_error.png

当时纳闷了,为什么本地环境没问题,代码在GitLab上的服务器就有问题了?

问题解决

仔细看了下错误信息,发现就是Jedis里面报错,查看源码也找到了报错的地方,如下代码:

public static String getLocalHostQuietly() {
String localAddress;
try {
  localAddress = InetAddress.getLocalHost().getHostAddress();
} catch (Exception ex) {
  log.logp(Level.SEVERE, HostAndPort.class.getName(), "getLocalHostQuietly", "cant resolve localhost address", ex);
  localAddress = "localhost";
}
return localAddress
}

简单的分析了下,此处报错就是为获取到服务器上localhost address

于是登陆CI服务器,查看hostname后,https://raw.githubusercontent.com/smartlin/pic/main/_posts/redis/redis%E4%B8%8D%E8%83%BD%E8%A7%A3%E6%9E%90localhost%E5%9C%B0%E5%9D%80.md/bug.png

[root@template conf]# hostname
hostname
[root@template conf]# 

在host文件中的localhost后添加hostname即可

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 hostname
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

配置完成后,神奇般的好了,不在报之前的错误,单元测试也OK了

刨根问底

那么问题来了,Jedis为什么要获取linux主机的hostname了?
终于让我在stackoverflow找到答案,详情请点击,居然是个bug,天呐!!!!使用2.9.x之后的版本即可解决此问题,截图如下:

bug

end,感谢阅读!!!


# redis