在没有确定端口的情况下在Thread上远程调试Java应用程序

在没有确定端口的情况下在Thread上远程调试Java应用程序,java,yarn,jdwp,Java,Yarn,Jdwp,我已经在谷歌上搜索过,知道如何使用以下选项来调试远程Java应用程序 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 但是,我的应用程序将在纱线中运行,并且在一台机器中可能有多个进程。因此,由于端口冲突,我无法在java选项中设置确定性端口。纱线的痛苦在于纱线不能管理端口资源,所以我不知道未使用的端口 我们对JMX有类似的要求。幸运的是,我们可以自己在应用程序中启动JMX服务器,例如 def sta

我已经在谷歌上搜索过,知道如何使用以下选项来调试远程Java应用程序

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
但是,我的应用程序将在纱线中运行,并且在一台机器中可能有多个进程。因此,由于端口冲突,我无法在java选项中设置确定性端口。纱线的痛苦在于纱线不能管理端口资源,所以我不知道未使用的端口

我们对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。提前谢谢你的帮助