JDK导致ActiveMQ、Kafka连接zookeeper失败:Session 0x0 for server 10.1.21.244/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect

发布时间 2023-05-05 11:32:06作者: 没有星星的夏季

  最近在部署一套ActiveMQ集群时,使用zookeeper来实现,zookeeper启动了,在启动ActiveMQ时,抛出异常:

    

    WARN | Session 0x0 for server 10.1.21.244/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect
    java.lang.IllegalArgumentException: Unable to canonicalize address 10.1.21.244/<unresolved>:2181 because it's not resolvable
        at org.apache.zookeeper.SaslServerPrincipal.getServerPrincipal(SaslServerPrincipal.java:65)
        at org.apache.zookeeper.SaslServerPrincipal.getServerPrincipal(SaslServerPrincipal.java:41)
        at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1001)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1060)

  翻了很多资料,查了zookeeper的源码,也没找到处理方法,简单说,这个问题就是地址解析失败导致的,但是找不到解决办法,然后病急乱投医,不停地更换ActiveMQ、Zookeeper的版本,ActiveMQ从5.17.0开始就不支持zookeeper做集群了,所以5.16.x版试了个遍,还是不行,zookeeper也是从3.4.x到3.8.x都试了个遍,也不行。

  就在快放弃的时候,终于翻到了原因(地址):

  

  更详细的说明(地址):

  

  简单的说,这就是JDK的bug,我使用的高版本的JDK:

  

  但是因为ActiveMQ从5.17.0开始就不支持zookeeper做集群了,所以选用了5.16.x版本来部署,也就是说,使用高版本的JDK来运行低版本的ActiveMQ,这样就报错了。

  最后的解决办法是降低JDK的版本,附带上我使用的JDK版本地址:

  百度云下载:https://pan.baidu.com/s/13dPvlNhaLocDxCr84-Y0rw (提取码: 9ir4)

  -------------------------------------------分割线--------------------------------------------

  这里顺带提一下,ActiveMQ包中的bin目录下有个env文件,是用来配置环境变量的,里面有一个JAVACMD环境变量,将它配置成我们低版本的JDK即可

  

  或者添加JAVA_HOME环境变量也可以,总之就是让ActiveMQ单独使用低版本JDK即可,而不需要替换全局的JDK

  最后,吐槽一下,JDK高版本既然不能兼容低版本,为什么不抛出警告而让它直接报错?我也是醉了,后续应该还会有人碰到这个报错,这里记一下