简体   繁体   English

Jmx 连接客户端

[英]Jmx connection client

I want to create a JMX client, which can work with my server.我想创建一个 JMX 客户端,它可以与我的服务器一起使用。 I can connect to my server with jconsole, but how can I do it with java code.我可以使用 jconsole 连接到我的服务器,但是我如何使用 java 代码来做到这一点。

This is my server code:这是我的服务器代码:

            MBeanServer mbeanServer = ManagementFactory
                .getPlatformMBeanServer();

        //giving name for service
        ObjectName objectName = new ObjectName("bean:name=logService");
        RequiredModelMBean mbean = new RequiredModelMBean();

        mbean.setManagedResource(logService, "objectReference");

        Descriptor logStringDescriptor = new DescriptorSupport(
                new String[] { "name=logString",
                        "descriptorType=attribute",
                        "getMethod=getLogString", "setMethod=setLogString" });
        
        ModelMBeanAttributeInfo logStringAttribute = new ModelMBeanAttributeInfo(
                "logString", "java.lang.String", "String to be logged",
                true, true, false, logStringDescriptor);

        ModelMBeanOperationInfo getLogStringOperation = new ModelMBeanOperationInfo(
                "Get the log string",
                LoggerService.class.getMethod("getLogString"));
        
        ModelMBeanOperationInfo setLogStringOperation = new ModelMBeanOperationInfo(
                "Set the log string", LoggerService.class.getMethod(
                        "setLogString", String.class));

        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(
                "LoggerService", "Logger Service",
                new ModelMBeanAttributeInfo[] { logStringAttribute }, null,
                new ModelMBeanOperationInfo[] { getLogStringOperation,
                        setLogStringOperation }, null);

        mbean.setModelMBeanInfo(mbeanInfo);
        mbeanServer.registerMBean(mbean, objectName);

It is very simple :)这很简单:)

            MBeanServer mbeanServer = ManagementFactory
                .getPlatformMBeanServer();


        //giving name for service
        ObjectName objectName = new ObjectName("bean:name=logService");

        String str = (String) mbeanServer.getAttribute (objectName, "logString");
        System.out.println(str);

You have to create a JMX agent which will be a wrapper of your MBeans server and allow connecting to your application by external processes with the usage of special adapter.您必须创建一个 JMX 代理,它将成为您的 MBeans 服务器的包装器,并允许通过使用特殊适配器的外部进程连接到您的应用程序。 This adapter will allow your clients to connect to MBean server using certain protocol (SNMP, HTTP etc.) or technology (RMI).此适配器将允许您的客户端使用特定协议(SNMP、HTTP 等)或技术 (RMI) 连接到 MBean 服务器。 You can read about adapters here: http://marxsoftware.blogspot.com/2008/08/remote-jmx-connectors-and-adapters.html您可以在此处阅读有关适配器的信息: http : //marxsoftware.blogspot.com/2008/08/remote-jmx-connectors-and-adapters.html

public static <T> T createJmxClient(Class<T> clazz, String objectName, String serviceUrl) {
    return createJmxClient(clazz, objectName, serviceUrl, null, null);
}

public static <T> T createJmxClient(Class<T> clazz, String objectName, String serviceUrl, final String user, final String pass) {
    try {
        JMXServiceURL jmxServiceUrl = new JMXServiceURL(serviceUrl);
        Map<String, ?> env = user == null ? null : new HashMap<String, Object>() {{
            put(JMXConnector.CREDENTIALS, new String[] {user, pass});
        }};
        JMXConnector jmxc = JMXConnectorFactory.connect(jmxServiceUrl, env);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        ObjectName mbeanName = new ObjectName(objectName);
        return JMX.newMBeanProxy(mbsc, mbeanName, clazz, true);
    } catch (IOException | MalformedObjectNameException e) {
        throw new RuntimeException("Can not create client for remote JMX " + serviceUrl, e);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM