一、简介
上一节介绍的是通过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。
分享到:
相关推荐
3. `org.eclipse.jmx`: 插件的核心功能,实现JMX连接和管理的接口、类和实用工具。 4. `com.sun.jmx`: JMX API的实现,用于与服务端交互。 插件可能会通过Eclipse的扩展点机制(extension points)来集成到Eclipse...
为了实现远程连接JVM并获取JVM参数,首先需要在服务器端启动JMX服务,并注册包含JVM信息的MBean。然后,客户端通过RMI连接到服务器的JMX代理,使用JMX API来查询或操作MBean。例如,你可以获取内存使用情况、线程...
jmx 实现远程连接tomcat jmx(Java Management Extensions)是一种Java技术,用于监控和管理Java应用程序。下面我们将详细介绍如何使用jmx实现远程连接tomcat。 一、配置环境 首先,我们需要确保Linux下配置好...
通过设置`-Dcom.sun.management.jmxremote.rmi.port`和`-Dcom.sun.management.jmxremote.port`等参数,可以启用RMI服务,允许远程客户端连接到JMX服务器。 2. **自定义JMX客户端**:开发者可以编写自己的JMX客户端...
完成上述配置后,你将能够通过JMX从远程客户端连接到Tomcat服务器,进行监控和管理。然而,为了生产环境的安全性,强烈建议在实际部署时开启认证(`-Dcom.sun.management.jmxremote.authenticate=true`),并配置...
在实际应用中,可以通过编写Java代码来建立JMX客户端,连接到远程服务器的MBeanServer,然后通过MBean接口获取并处理监控数据。也可以使用工具,如JConsole、VisualVM等,它们提供了图形化的界面来直接查看和操作...
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...
完成上述配置后,就可以使用之前获取的 JMX URL 来连接 TongWeb7 的 JMX 服务,例如 `service:jmx:rmi:///jndi/rmi://192.168.163.99:7200/jmxrmi`。你可以使用 Java 提供的 `jconsole` 工具,或者其他支持 JMX 的第...
在服务器端配置JMX时,首先需要确保你的Java应用程序支持JMX。这通常通过在Java代码中添加MBean(Managed Bean)来实现,MBean是JMX中的管理对象,代表了要管理的资源或服务。你可以自定义MBean,定义其属性、操作和...
3. **连接到服务器**:使用`JMXConnector.connect()`方法连接到远程MBeanServer。连接成功后,我们可以获取`MBeanServerConnection`对象。 4. **操作MBeans**:通过`MBeanServerConnection`,我们可以查询MBeans、...
它包含了服务器端的实现,比如MBeanServer,以及远程访问JMX代理的基础设施。 2. **jmxremote.jar**:这个库则主要涉及JMX的远程访问功能。它包含了支持JMX远程连接的类和配置,允许你从远程主机或不同的Java虚拟机...
3. **Management Clients**: 这些是使用JMX API与MBean Server交互的应用程序。在本项目中,"ops-container"可能就是一个管理客户端,它连接到WebLogic、Tomcat和WebSphere的MBean Server,并执行监控任务。 4. **...
3. JMX Connectors:JMX连接器允许客户端与MBean服务器通信,支持RMI、HTTP、HTTPS等多种协议。 4. Notifications:MBeans可以通过发送通知来通告系统状态的变化,客户端可以订阅这些通知。 5. Attributes, ...
5. **JMX连接器**:`jmxdemo`可能包含了JMX连接器的配置,如RMI连接器,允许远程客户端连接到MBean服务器进行管理操作。 6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到...
* rmi.port:设置RMI连接的端口号,默认为60001。 * password.file:设置jmx.password文件的路径,用于存储jmx监控的密码。 * access.file:设置jmx.access文件的路径,用于存储jmx监控的权限配置。 在conf/...
服务器(Server)是托管MBeans的地方,而代理(Agent)则提供了连接到服务器并执行管理操作的能力,这通常涉及到JMX RI的功能。 4. **MBean类型**: MBeans有三种主要类型:Standard MBeans、Dynamic MBeans和Open...