最近在部署一套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高版本既然不能兼容低版本,为什么不抛出警告而让它直接报错?我也是醉了,后续应该还会有人碰到这个报错,这里记一下
标签:10.1,unexpected,java,JDK,0x0,zookeeper,版本,ActiveMQ From: https://www.cnblogs.com/shanfeng1000/p/17373653.html