JConsole连接Docker中Kafka Sandbox频繁断开问题求助
问题:JConsole连接Docker中Kafka Connect的JMX时出现连接丢失与SecurityException
连接localhost:35000时,先弹出错误:
"Secure Connection Failed: Retry Insecurely?"(安全连接失败:是否重试非安全连接?)
点击Insecure connection(非安全连接)后,连接瞬间断开,提示:
"Connection Lost: Reconnect?"(连接丢失:是否重新连接?)
调试日志抛出核心异常:
java.lang.SecurityException: Expecting a sun.rmi.server.UnicastRef2 remote reference in stub!
当前使用的JConsole参数
jconsole -debug -J"-Dcom.sun.management.jmxremote=true, -Dcom.sun.management.jmxremote.authenticate=false, -Dcom.sun.management.jmxremote.ssl=false, -Djava.rmi.server.hostname=localhost, -Dcom.sun.management.jmxremote.local.only=false, -Dcom.sun.management.jmxremote.rmi.port=35000, -Dcom.sun.management.jmxremote.port=35000, -Dcom.sun.management.jmxremote.port=35000"
Java环境信息
java 14.0.1 2020-04-14 Java(TM) SE Runtime Environment (build 14.0.1+7) Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
Docker容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b21d9589e737 mongodb-kafka-base-setup-mongod:1.0 "bash -c 'sleep 10 &…" 4 days ago Exited (0) 4 days ago mongo1-setup c0a23e041e23 mongodb-kafka-base-mongod:1.0 "docker-entrypoint.s…" 4 days ago Up 4 days 0.0.0.0:35001->27017/tcp mongo1 7c56b4ccc89a confluentinc/cp-kafka-rest:7.2.2 "/etc/confluent/dock…" 4 days ago Up 4 days 8082/tcp rest-proxy 3b6fd1821270 confluentinc/cp-schema-registry:7.2.2 "/etc/confluent/dock…" 4 days ago Exited (1) 4 days ago schema-registry c303de030d9f confluentinc/cp-kafka-connect-base:7.2.2 "/etc/confluent/dock…" 4 days ago Up 4 days (healthy) 8083/tcp, 9092/tcp, 0.0.0.0:35000->35000/tcp connect 4c1665f78d4c confluentinc/cp-kafka:7.2.2 "/etc/confluent/dock…" 4 days ago Up 4 days 9092/tcp broker b707c2d6b8be confluentinc/cp-zookeeper:7.2.2 "/etc/confluent/dock…" 4 days ago Up 4 days 2181/tcp, 2888/tcp, 3888/tcp zookeeper
Netstat端口监听情况
TCP 0.0.0.0:35000 0.0.0.0:0 LISTENING TCP [::]:35000 [::]:0 LISTENING TCP [::1]:35000 [::]:0 LISTENING
解决方案
这个sun.rmi.server.UnicastRef2异常本质是Java版本不兼容:你本地用Java 14,而Confluent Platform 7.2.2默认搭载Java 11,Java 12+对RMI stub格式做了变更,导致跨版本JMX连接失败。
具体修复步骤:
匹配Java版本
安装与容器一致的Java 11,用对应版本的jconsole发起连接,这是最稳妥的方案。修正JConsole参数格式
你当前的-J参数用逗号分隔是错误的,JVM参数需要用空格单独拆分,正确写法:jconsole -debug -J-Dcom.sun.management.jmxremote=true -J-Dcom.sun.management.jmxremote.authenticate=false -J-Dcom.sun.management.jmxremote.ssl=false -J-Djava.rmi.server.hostname=localhost -J-Dcom.sun.management.jmxremote.local.only=false -J-Dcom.sun.management.jmxremote.rmi.port=35000 -J-Dcom.sun.management.jmxremote.port=35000调整容器JMX配置
在Kafka Connect的容器启动参数中添加-Dsun.rmi.server.disableHttp=true,强制使用旧版RMI stub格式,兼容高版本Java客户端。同时注意容器内的java.rmi.server.hostname不要设为localhost,改为容器IP或宿主机可访问的地址。临时绕过版本限制
不想换Java版本的话,给jconsole添加强制使用旧stub的参数:jconsole -debug -J-Djdk.rmi.stub.server.useOldStub=true -J-Dcom.sun.management.jmxremote=true -J-Dcom.sun.management.jmxremote.authenticate=false -J-Dcom.sun.management.jmxremote.ssl=false -J-Djava.rmi.server.hostname=localhost -J-Dcom.sun.management.jmxremote.local.only=false -J-Dcom.sun.management.jmxremote.rmi.port=35000 -J-Dcom.sun.management.jmxremote.port=35000
内容的提问来源于stack exchange,提问作者user2966445
相关产品推荐
相关产品推荐

