我已经用谷歌搜索并知道使用以下选项来启用调试远程 Java 应用程序。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
但是,我的应用程序会在 Yarn 中运行,一台机器上可能会有多个进程。因此,由于端口冲突,我无法在 java 选项中设置确定性端口。Yarn 的痛点是 Yarn 不管理端口资源,所以不知道未使用的端口。
我们对 JMX 有类似的要求。幸运的是,我们可以自己在我们的应用程序中启动 JMX 服务器,比如
def start(port: Int): Int = {
if (jmxConnectorServer != null) {
// TODO log or throw error?
}
try {
LocateRegistry.createRegistry(port);
}
catch {
case e: java.rmi.server.ExportException if e.getCause != null && e.getCause.isInstanceOf[java.net.BindException] => {
// TODO
println(s"port $port already in use, try ${port + 1}")
return start(port + 1)
}
}
val env = new JHashMap[String, Any]()
env.put("com.sun.management.jmxremote.authenticate", "false")
env.put("com.sun.management.jmxremote.ssl", "false")
val url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + port + "/jmxrmi")
val mBeanServer = ManagementFactory.getPlatformMBeanServer()
jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mBeanServer)
jmxConnectorServer.start()
port
}
在该start
方法中,我们将尝试端口,直到找到可用的端口,然后返回此端口。
所以我在 JDWP 中寻找类似的 API。提前感谢您的帮助。