私はすでにグーグルで検索し、次のオプションを使用してリモート Java アプリケーションのデバッグを有効にすることを知っています。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
ただし、私のアプリケーションは Yarn で実行され、1 台のマシンに複数のプロセスが存在する場合があります。そのため、ポートの競合により、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 を探しています。事前にご協力いただきありがとうございます。