2

私はすでにグーグルで検索し、次のオプションを使用してリモート 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 を探しています。事前にご協力いただきありがとうございます。

4

0 に答える 0