`
LuisFigo
  • 浏览: 38276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[探究JMX] 3、JMX服务器端连接

阅读更多

一、简介

 

      上一节介绍的是通过Web方式访问和操控MBean,本节所要介绍的是通过RMI方式,实现客户端与服务器端的通信,即客户端获取MBeanServerConnection,然后对服务器端被注册的MBean进行操作。

 

二、代码实例

 

 package com.muyu.jmx;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXPrincipal;
import javax.management.remote.JMXServiceURL;
import javax.security.auth.Subject;

public class MServer {
    
    public static void main(String[] args) {
        
        MBeanServer server = MBeanServerFactory.createMBeanServer();
        ObjectName configName;
        try {
            configName = new ObjectName("LuisFigo:name=config");
            Config config = new Config();
            server.registerMBean(config, configName);

          //注册RMI端口号
            Registry registry = LocateRegistry.createRegistry(9999);
            JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");        
            //权限验证
            Map env = new HashMap();
            env.put(JMXConnectorServer.AUTHENTICATOR, 
                    new JMXAuthenticator() { 
                public Subject authenticate(Object credentials) { 
                    String[] sCredentials = (String[]) credentials; 
                    String userName = sCredentials[0]; 
                    String password = sCredentials[1]; 
                    if ("admin".equals(userName) && "admin".equals(password)) { 
                        Set principals = new HashSet(); 
                        principals.add(new JMXPrincipal(userName)); 
                        return new Subject(true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET);
                        } 
                    else 
                        throw new SecurityException("Authentication failed! "); 
                    } 
                }
            );
            JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, server); 

            cs.start();
            System.out.println("rmi start.....");
            
        } catch (Exception e) {
            e.printStackTrace();
        }  
        
    }
   
}

 

package com.muyu.jmx;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

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

public class MClient {

    public static void main(String[] args) {
        try {
            JMXServiceURL url = new JMXServiceURL(
                    "service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");
            Map env = new HashMap();
            env.put(JMXConnector.CREDENTIALS, new String[]{"admin", "admin"});
            
            JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
            MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

            Set names = mbsc.queryNames(null, null);
            for (Iterator i = names.iterator(); i.hasNext();) {
                System.out.println("\tObjectName = " + (ObjectName) i.next());
            }

            ObjectName stdMBeanName = new ObjectName("LuisFigo:name=config");

            mbsc.invoke(stdMBeanName, "printConfigLocation", new String[]{"helloworld"}, new String[]{"java.lang.String"});
            mbsc.setAttribute(stdMBeanName, new Attribute("ConfigLocation", "LuisFigo, this is a new configLocation"));

            ConfigMBean proxy = (ConfigMBean) MBeanServerInvocationHandler
                    .newProxyInstance(mbsc, stdMBeanName, ConfigMBean.class, false);
            System.out.println(proxy.getConfigLocation());
            proxy.setConfigLocation("Beckham");
            System.out.println(proxy.getConfigLocation());
            proxy.printConfigLocation();
            jmxc.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 

说明

 

       运行MServer,其中LocateRegistry.createRegistry(9999)这段代码是为了注册RMI端口,下面JMXServiceURL会用 到9999这个端口。Env用于控制新连接器服务器的行为的一组属性,上面的部分代码是为了实现权限验证。如果客户端不输入正确的用户名和密码,则获取MServer服务端的连接。执行MClient,会发现一些有意思的现象,执行mbsc.invoke(stdMBeanName, "printConfigLocation", new String[]{"helloworld"}, new String[]{"java.lang.String"});这段代码时,其实是MServer端的MBean在执行printConfigLocation方法。假如MServer部署在一个JVM上,而MClient部署在另一个不同的JVM上,会得到同样的效果。不难看出利用远程调用方法也可以轻松实现分布式处理。

 

三、 总结

      使用JMX框架,可以用SUN自带的web方式管理MBean,也可以通过RMI接口自己实现对服务端MBean进行操作。下一节还会详细介绍Spring怎样集成MX4J实现JMX编程,MX4J自己实现了一套比较实用的界面来管理MBean。

 

 

分享到:
评论
1 楼 zilongzilong 2016-01-13  
    5篇文章对JMX讲解很到位,赞一个

相关推荐

    JMX 连接工具 Eclipse 插件

    3. `org.eclipse.jmx`: 插件的核心功能,实现JMX连接和管理的接口、类和实用工具。 4. `com.sun.jmx`: JMX API的实现,用于与服务端交互。 插件可能会通过Eclipse的扩展点机制(extension points)来集成到Eclipse...

    使用RMI远程连接JVM.用JMX获取JVM的参数

    为了实现远程连接JVM并获取JVM参数,首先需要在服务器端启动JMX服务,并注册包含JVM信息的MBean。然后,客户端通过RMI连接到服务器的JMX代理,使用JMX API来查询或操作MBean。例如,你可以获取内存使用情况、线程...

    jmx 实现远程连接tomcat

    jmx 实现远程连接tomcat jmx(Java Management Extensions)是一种Java技术,用于监控和管理Java应用程序。下面我们将详细介绍如何使用jmx实现远程连接tomcat。 一、配置环境 首先,我们需要确保Linux下配置好...

    jmx三种访问方式

    通过设置`-Dcom.sun.management.jmxremote.rmi.port`和`-Dcom.sun.management.jmxremote.port`等参数,可以启用RMI服务,允许远程客户端连接到JMX服务器。 2. **自定义JMX客户端**:开发者可以编写自己的JMX客户端...

    tomcat开启远程jmx连接方式

    完成上述配置后,你将能够通过JMX从远程客户端连接到Tomcat服务器,进行监控和管理。然而,为了生产环境的安全性,强烈建议在实际部署时开启认证(`-Dcom.sun.management.jmxremote.authenticate=true`),并配置...

    JMX 远程服务器信息监控

    在实际应用中,可以通过编写Java代码来建立JMX客户端,连接到远程服务器的MBeanServer,然后通过MBean接口获取并处理监控数据。也可以使用工具,如JConsole、VisualVM等,它们提供了图形化的界面来直接查看和操作...

    JMX以RMI方式连接的场景示例

    JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...

    TongWeb7的JMX监控.doc

    完成上述配置后,就可以使用之前获取的 JMX URL 来连接 TongWeb7 的 JMX 服务,例如 `service:jmx:rmi:///jndi/rmi://192.168.163.99:7200/jmxrmi`。你可以使用 Java 提供的 `jconsole` 工具,或者其他支持 JMX 的第...

    JMX配置与使用

    在服务器端配置JMX时,首先需要确保你的Java应用程序支持JMX。这通常通过在Java代码中添加MBean(Managed Bean)来实现,MBean是JMX中的管理对象,代表了要管理的资源或服务。你可以自定义MBean,定义其属性、操作和...

    jboss远程调用JMX

    3. **连接到服务器**:使用`JMXConnector.connect()`方法连接到远程MBeanServer。连接成功后,我们可以获取`MBeanServerConnection`对象。 4. **操作MBeans**:通过`MBeanServerConnection`,我们可以查询MBeans、...

    jmx相关jar包

    它包含了服务器端的实现,比如MBeanServer,以及远程访问JMX代理的基础设施。 2. **jmxremote.jar**:这个库则主要涉及JMX的远程访问功能。它包含了支持JMX远程连接的类和配置,允许你从远程主机或不同的Java虚拟机...

    jmx监控weblogic,tomcat,websphere源码

    3. **Management Clients**: 这些是使用JMX API与MBean Server交互的应用程序。在本项目中,"ops-container"可能就是一个管理客户端,它连接到WebLogic、Tomcat和WebSphere的MBean Server,并执行监控任务。 4. **...

    jmxri-1.2.1.jar+jmxtools-1.2.1.jar

    3. JMX Connectors:JMX连接器允许客户端与MBean服务器通信,支持RMI、HTTP、HTTPS等多种协议。 4. Notifications:MBeans可以通过发送通知来通告系统状态的变化,客户端可以订阅这些通知。 5. Attributes, ...

    Jmx实例demo下载

    5. **JMX连接器**:`jmxdemo`可能包含了JMX连接器的配置,如RMI连接器,允许远程客户端连接到MBean服务器进行管理操作。 6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到...

    jmx监控activeMQ监控

    * rmi.port:设置RMI连接的端口号,默认为60001。 * password.file:设置jmx.password文件的路径,用于存储jmx监控的密码。 * access.file:设置jmx.access文件的路径,用于存储jmx监控的权限配置。 在conf/...

    jmx-1.2.1(jmxri+jmxtools) jar

    服务器(Server)是托管MBeans的地方,而代理(Agent)则提供了连接到服务器并执行管理操作的能力,这通常涉及到JMX RI的功能。 4. **MBean类型**: MBeans有三种主要类型:Standard MBeans、Dynamic MBeans和Open...

Global site tag (gtag.js) - Google Analytics