我们在通过远程 jmx 连接时遇到问题。我们通过程序通过 ProcessBuilder 运行作业
代码片段:
param ="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=A.B.C.D -Dcom.sun.management.jmxremote.port=9875 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
ProcessBuilder pb = new ProcessBuilder("java", param,"-cp", jobArtifact.getAbsolutePath());
pb.command().add("org.springframework.batch.core.launch.support.CommandLineJobRunner");
final Process process = processBuilder.start();
进程正在启动,但是当我们尝试通过远程将其与 jconsole
连接时,它没有连接...并且出现连接失败消息:
Remote connection URL: service:jmx:rmi:///jndi/rmi://A.B.C.D:9875/jmxrmi
我们已经尝试过:
- 添加了
-Djava.rmi.server.hostname=A.B.C.D
和
-Dcom.sun.management.jmxremote.local.only=false
ProcessBuilder.getEnv()
并添加了我们的环境属性。当我们通过命令提示符运行相同的程序时:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9875 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -cp C:\jobs\abc.jar org.springframework.batch.core.launch.support.CommandLineJobRunner
它正在运行,并且能够使用上述相同的 URL 通过远程连接
jmx
。
欢迎任何建议/解决方法!!!
最佳答案
每个 -D
选项都需要是 ProcessBuilder
的单独参数:
ProcessBuilder pb = new ProcessBuilder("java",
"-Dcom.sun.management.jmxremote",
"-Djava.rmi.server.hostname=A.B.C.D",
// etc. etc.
"-cp", jobArtifact.getAbsolutePath(),
"org.springframework.batch.core.launch.support.CommandLineJobRunner");
final Process process = processBuilder.start();
您当前的代码(将所有这些代码连接在一起形成一个参数)本质上是设置一个名为 "com.sun.management.jmxremote -Djava.rmi.server.hostname"的属性
为值 "A.B.C.D -Dcom.sun.management.jmxremote.port=9875 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
(包括尾部空格)。
关于java - PocessBuilder 程序无法远程连接到 JMX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25743337/