Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法启动JMXConnectorServer_Java_Jmx - Fatal编程技术网

Java Can';无法启动JMXConnectorServer

Java Can';无法启动JMXConnectorServer,java,jmx,Java,Jmx,我想通过JMX远程连接到我的应用程序,所以我在main方法中创建了以下配置: MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:7890/jmxrmi"); Map<String, Object> envConf = new HashMap<>

我想通过JMX远程连接到我的应用程序,所以我在main方法中创建了以下配置:

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:7890/jmxrmi");
Map<String, Object> envConf = new HashMap<>();
//My custom authenticator
envConf.put(JMXConnectorServer.AUTHENTICATOR, new MyAuthenticator(jmxUsername, jmxPassword));
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, envConf, mbs);
cs.start();
但似乎缺少了什么,我得到了以下例外:

Cannot bind to URL [rmi://localhost:7890/jmxrmi]: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
java.io.IOException: Cannot bind to URL [rmi://localhost:7890/jmxrmi]: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
    at javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServer.java:827)
    at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:432)
    at test.jms.Main.start(JmxModule.java:35)
Caused by: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
    at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:147)
    at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:228)
    at javax.naming.InitialContext.bind(InitialContext.java:425)
    at javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:644)
    at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:427)
    ... 4 more
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:420)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$254(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$13/8098086.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:141)
    ... 8 more
Caused by: java.rmi.AccessException: Cannot modify this registry
    at sun.management.jmxremote.SingleEntryRegistry.bind(SingleEntryRegistry.java:76)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$254(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$13/8098086.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

您能告诉我哪里错了吗?

通过使用 java-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7890 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 主要

您正在端口7890上启动默认的RMI JMX连接器。您尝试在同一端口上启动自定义连接器,但失败


如果要使用自己的连接器实例,可以安全地省略所有-Dcom.sun.management.jmxremote.属性。

问题是我没有运行RMI注册表,所以只需在控制台中运行以下命令:

rmiregistry
或在服务器启动之前添加这行代码:

LocateRegistry.createRegistry(1099);

解决了一个问题。

下面是JDK 1.8从和扩展而来的一个最简单的工作示例

链接中代码中缺少的关键步骤和可接受的答案如下:

  • LocateReigstry.createRegistry(端口)
  • Thread.sleep()循环以确保应用程序不会关闭
  • 答案并没有描述MyAuthenticator。我的答案使用默认验证器,该验证器期望访问和密码文件的路径
  • 工作代码Main.java:

    import javax.management.MBeanServer;
    import javax.management.remote.JMXConnectorServer;
    import javax.management.remote.JMXConnectorServerFactory;
    import javax.management.remote.JMXServiceURL;
    
    import java.lang.management.ManagementFactory;
    import java.rmi.registry.LocateRegistry;
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            if(args.length != 2) {
                throw new IllegalArgumentException("Main <port> <path suffix>"
                                + "\nservice:jmx:rmi:///jndi/rmi://localhost:<port>/<pathsuffix>"
                                );
            }
    
            int port = Integer.parseInt(args[0]);
            String pathSuffix = args[1];
    
            LocateRegistry.createRegistry(port);
    
            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
            JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + port + "/" + pathSuffix);
    
            Map<String, Object> envConf = new HashMap<>();
            envConf.put("jmx.remote.x.password.file", "password.properties");
            envConf.put("jmx.remote.x.access.file", "access.properties");
    
            JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, envConf, mbs);
            cs.start();
    
            while(true) {
                Thread.sleep(1000);
            }
        }
    
    }
    
    jmx.remote.x.password.file的内容:

    admin password
    
    我使用(假设8474可用)从maven执行代码:


    在这种情况下,我有另一个例外:
    无法绑定到URL[rmi://localhost:7890/jmxrmi]:javax.naming.ServiceUnavailableException[根异常为java.rmi.ConnectException:拒绝连接主机:localhost;嵌套异常为:java.net.ConnectException:拒绝连接:connect]
    。端口未关闭且未被防火墙阻止通常情况下,人们应使用此解决方案。您不应该自己启动JMX服务器。但是,如果您需要某种定制,并且需要自己启动,请查看Oleskii或我的答案。如何运行rmiregistry,或者您在哪里添加了这行代码?
    admin readwrite
    
    admin password
    
    javac Main.java
    java Main  8474 jmxrmi