当前位置: 首页 > 知识库问答 >
问题:

运行JMXConnectorF时JMX Connection不会重播actory.connect

朱宜
2023-03-14

需要您的帮助来理解为什么我无法使用JMX从客户端应用程序连接到服务器应用程序。我有一个正在启动JMX Bean服务器的服务器应用程序和一个试图使用JMX连接到此服务器的客户端。这两个应用程序都在Windows中的本地机器上破坏。Jema工作正常,我可以将其连接到服务器。但是在运行客户端时,它会“卡住”在线:

  JMXConnector jmxConnector = JMXConnectorFactory.connect(url, null);

应用端JMX Server初始化代码:

    MyClass mc = new MyClass ();
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    ObjectName obj = new ObjectName("JMX:name=MyClassJmx");
    mbs.registerMBean(mc, obj);

应用程序端JMX服务器JVM参数:

-Dcom.sun.management.jmxremote.port=10090
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

我的客户端连接到应用程序代码:

  final JMXServiceURL url = new JMXServiceURL("service:jmx:jmxmp://127.0.0.1:10090");
  JMXConnector jmxConnector = JMXConnectorFactory.connect(url, null);
  jmxConnector.connect();

注释,使用

服务:jmx:rmi:///jndi/rmi://:10090/jmxrmi

正在工作。

共有1个答案

万俟华辉
2023-03-14

Java参考

JMX消息传递协议(JMXMP)连接器是通用连接器的配置,其中传输协议基于TCP,对象包装是本机Java序列化。安全性比RMI连接器更高级。安全性基于Java安全套接字扩展(JSSE)、Java身份验证和授权服务(JAAS)以及简单身份验证和安全层(SASL)。

通用连接器及其JMXMP配置是可选的,这意味着它们并不总是包含在JMX远程API的实现中。J2SE平台不包括可选的通用连接器。

注意:如果您想使用JMXMP连接器,请从下载JSR 160参考实现http://java.sun.com/products/JavaManagement/download.html,并添加jmxremote_可选。jar文件到类路径。

您是否包括jmxremote_可选。服务器和客户端类路径中的jar文件?

我之前没有使用JMXMP连接器方法的经验,我遵循了JMX文档,并试图通过编写以下示例进行验证,结果证明它是有效的。

JMX MBean接口

SystemConfigMBean.java

package jmx.learning;

public interface SystemConfigMBean {

    public void setThreadCount(int noOfThreads);
    public int getThreadCount();
    
    public void setSchemaName(String schemaName);
    public String getSchemaName();
    
    // any method starting with get and set are considered
    // as attributes getter and setter methods, so I am 
    // using do* for operation.
    public String doConfig();
}

实现JMX MBean接口的类

SystemConfig.java

package jmx.learning;

public class SystemConfig implements SystemConfigMBean {

    private int threadCount;
    private String schemaName;
    
    public SystemConfig(int numThreads, String schema){
        this.threadCount=numThreads;
        this.schemaName=schema;
    }
    
    @Override
    public void setThreadCount(int noOfThreads) {
        this.threadCount=noOfThreads;
    }


    @Override
    public int getThreadCount() {
        return this.threadCount;
    }


    @Override
    public void setSchemaName(String schemaName) {
        this.schemaName=schemaName;
    }


    @Override
    public String getSchemaName() {
        return this.schemaName;
    }
    
    @Override
    public String doConfig(){
        return "No of Threads="+this.threadCount+" and DB Schema Name="+this.schemaName;
    }

}

使用JMXMP连接器在MBean服务器中创建和注册MBean

SystemConfigManagement.java

package jmx.learning;

import java.io.IOException;

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class SystemConfigManagement {
    private static final int DEFAULT_NO_THREADS = 10;
    private static final String DEFAULT_SCHEMA = "default";

    public static void main(String[] args) throws MalformedObjectNameException,
            InterruptedException, InstanceAlreadyExistsException,
            MBeanRegistrationException, NotCompliantMBeanException, IOException {
        // Instantiate the MBean server
        MBeanServer mbs = MBeanServerFactory.createMBeanServer();

        // Create a JMXMP connector server
        JMXServiceURL url = new JMXServiceURL("jmxmp", null, 5555);
        JMXConnectorServer cs = JMXConnectorServerFactory
                .newJMXConnectorServer(url, null, mbs);
        cs.start();

        // register the MBean
        SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS,
                DEFAULT_SCHEMA);
        ObjectName name = new ObjectName("jmx.learning:type=SystemConfig");
        mbs.registerMBean(mBean, name);
        do {
            Thread.sleep(3000);
            System.out.println("Thread Count=" + mBean.getThreadCount()
                    + " Schema Name=" + mBean.getSchemaName());
        } while (mBean.getThreadCount() != 0);

    }
}

JMXMP连接器客户端

SystemConfigManagementClient.java

package jmx.learning;

import java.io.IOException;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class SystemConfigManagementClient {
    public static void main(String[] args) {
        JMXConnector jmxc = null;
        try {
            // Create a JMXMP connector client
            System.out.println("\nCreate a JMXMP connector client");
            JMXServiceURL url = new JMXServiceURL(
                    "service:jmx:jmxmp://localhost:5555");
            jmxc = JMXConnectorFactory.connect(url, null);
            // get MBeanServerConnection
            MBeanServerConnection serverConn = jmxc.getMBeanServerConnection();

            ObjectName objectName = new ObjectName(
                    "jmx.learning:type=SystemConfig");

            // Executing doConfig() method
            String value = (String) serverConn.invoke(objectName, "doConfig",
                    new Object[] {}, new String[] {});
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jmxc != null) {
                try {
                    jmxc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

注意:我已经下载了jmxremote_optional.jar文件并保存在项目类路径中。

执行:

服务器输出:

d:\Java\jdk1.8.0_261\bin\java.exe -cp .;d:\External_Library\jmxremote_optional.jar jmx.learning.SystemConfigManagement
Thread Count=10 Schema Name=default
Thread Count=10 Schema Name=default

客户端输出:

d:\Java\jdk1.8.0_261\bin\java.exe -cp .;d:\External_Library\jmxremote_optional.jar jmx.learning.SystemConfigManagementClient

Create a JMXMP connector client
No of Threads=10 and DB Schema Name=default

我不确定您编写的服务器代码,看起来该代码需要RMIConnector。因此,在客户端,使用RMI连接器Java远程方法协议(JRMP)的连接尝试正在工作。

即使您已经传递了property-Dcom.sun.management.jmxremote。port=portNum此属性表示,portNum是要通过其启用JMX RMI连接的端口号。

注意:出于演示目的,我没有在实际代码中展示安全处理的东西,这些东西需要到位。

 类似资料:
  • 我需要制作一个音频播放器,每当这个子例程运行时,它都会播放一个声音剪辑。在播放新的之前,它还必须停止以前的声音剪辑。 我遇到的问题是,剪辑从来没有注册为运行。检查它是否正在运行的两个if语句都没有使用过。这意味着剪辑只有在完成时才会停止,它们可能会重叠,从而破坏程序。 我会使用剪辑停止();在其他子例程中,但它会告诉我找不到“剪辑”符号。我不知道如何使其可供其他子例程使用。 我唯一能得到剪辑的方法

  • 从我所读到的一切来看,它应该是可行的,但是以下几点: 在…内 不工作。与应用程序加载类似,但使用的是recyclingView\u Main。adapter=MainAdapter()似乎未运行。 完整代码: 正如您从上面的代码中看到的,当我将其放在onCreate中时,它工作得很好。 因此,问题似乎是将其发送到主线程。 XML

  • 问题内容: 我写了一段代码来了解运行时多态性… 实例变量受到编译时的约束,但是为什么这里的对象的向下转换没有意义?表示它是调用方法而不是方法? 问题答案: 让我们看看这里有什么: 可变的的, 引用类型 ; 一个实例创建表达式,产生一个对象类型,其中; 一个 向上转型表达式参考 ,向上转型上述表达式成型; 将3.的结果分配给变量。 阅读Java时,您必须牢记以下几点: 对象 的 类型 :对象永远不能

  • 问题内容: 我同时运行两个AJAX请求时遇到问题。我有一个PHP脚本正在将数据导出到XSLX。此操作需要很多时间,因此我尝试向用户显示进度。我正在使用AJAX和数据库方法。实际上,我非常确定它曾经可以工作,但是我不知道为什么,它不再在任何浏览器中都能工作。新浏览器有什么变化吗? 在数据库中正确更新进度 JS计时器正在尝试获取进度,我可以在控制台中看到它,但是所有这些请求都加载第一个脚本的整个持续时

  • 所以一切都很好,就像2到3周前一样,突然我所有的jar文件都无法通过双击打开 我检查了我的注册表,但一切正常,关联的. jar应用程序可以使用javaw运行,但我仍然无法双击运行可执行的. jar文件 我可以用javaw -jar文件名在cmd中运行它们.jar但它不适用于我的世界,我不能用那个cmd运行我的世界,我想让它,所以每个可执行文件.jar文件都可以打开双击 我的 java 命令在 cm

  • 我试图在启动时运行我python脚本,但它不起作用。 下面是我的python脚本(不起作用): 这是我的python脚本(works): 下面是我的rc.local文件(也可以尝试crontab并在/ect/init.d中设置服务): 看起来通过导入paho.mqtt.发布可以让我的脚本停止工作,我是Linux的新手,我不知道为什么。有人可以帮助我吗?感谢您的帮助。 Ubuntu 16.04 如果