标准Mbean
package jmxtest;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* @author fengzl
*/
public interface HelloWorldMBean extends Serializable {
void setName(String name);
String getName();
void sayHello();
String getHelloString();
int getId();
String toString();
int hashCode();
boolean equals( Object obj);
HelloWorldMBean getThis();
}
class HelloWorld implements HelloWorldMBean, Serializable {
static AtomicInteger count = new AtomicInteger();
private static final long serialVersionUID = 1627976932729278650L;
int id = count.incrementAndGet();
String name;
public synchronized void setName(String name) {
this.name = name;
}
public synchronized String getName() {
return name;
}
public synchronized void sayHello() {
System.out.println(getHelloString());
}
public synchronized String getHelloString() {
return "Hello, " + name;
}
public synchronized int getId() {
return id;
}
public HelloWorldMBean getThis() {
return this;
}
}
服务端注册
/*
* Copyrights (C) 2008 Bearice (Bearice@Gmail.com)
* Release under GNU/GPL Version 2.
*/
package jmxtest;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.security.auth.Subject;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(8877);
MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName helloName = new ObjectName("hello:name=hello");
HelloWorld hello = new HelloWorld();
HashMap<String, Object> prop = new HashMap<String, Object>();
prop.put(JMXConnectorServer.AUTHENTICATOR, new JMXAuthenticator() {
public Subject authenticate(Object credentials) {
System.out.println(credentials);
if (credentials instanceof String) {
if (credentials.equals("hello")) {
return new Subject();
}
}
throw new SecurityException("not authicated");
}
});
JMXConnectorServer cserver =
JMXConnectorServerFactory.newJMXConnectorServer(
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8877/hello"), prop, server);
cserver.start();
server.registerMBean(hello, helloName);
for (ObjectInstance object : server.queryMBeans(null, null)) {
System.out.println(object.getObjectName());
}
System.out.println(hello);
System.out.println("start.....");
}
}
客户端验证
package jmxtest;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.HashMap;
import javax.management.JMX;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
static HelloWorldMBean hello;
public static void main(String[] args) throws Exception {
final AtomicInteger count = new AtomicInteger();
HashMap<String,Object> prop = new HashMap<String, Object>();
prop.put(JMXConnector.CREDENTIALS, "hello");
final JMXConnector conn = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8877/hello"), prop);
conn.connect();
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
try {
final HelloWorldMBean hello = JMX.newMBeanProxy(conn.getMBeanServerConnection(), new ObjectName("hello:name=hello"), HelloWorldMBean.class);
hello.setName("bearice");
hello.sayHello();
hello.getHelloString();
System.out.println(count.incrementAndGet());
Client.hello = hello;
System.out.println(hello.equals(hello.getThis()));
} catch (Exception ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};
Thread[] ts = new Thread[5];
for (int i = 0; i < ts.length; i++) {
ts[i] = new Thread(r);
ts[i].start();
}
for (Thread t : ts) {
t.join();
}
System.out.println(hello.equals(hello.getThis()));
System.out.println(hello.getId());
System.out.println(hello);
}
}
分享到:
相关推荐
RI是JMX规范的具体实现,允许开发者在Java应用程序中使用JMX功能,如创建MBeans(Managed Beans),管理对象和服务,以及实现远程监控。它包含API库、示例代码和必要的文档,帮助开发者理解和使用JMX 1.2.1的功能。 ...
3. `jmxri.jar`和`jmxtools.jar`:这两个JAR文件是JMX RMI实现的核心库,分别包含了RMI服务器和客户端的实现,使得远程JMX交互成为可能。 4. `jmxri.properties`和`jmxtools.properties`:这些配置文件可能包含了...
在本场景中,我们将介绍如何使用RMI(Remote Method Invocation)连接方式来实现JMX框架的各层级的连接。 MBean是JMX框架的基本组件,用于提供管理信息和功能。MBean可以是任何Java对象,只要它实现了相关的接口。...
这个库提供了RMI(Remote Method Invocation)实现,使得JMX代理(MBeans)可以被远程调用和管理,增强了跨网络的可管理性。 2. **JMX Tools**: jmxtools.1.2.1.jar则包含了一系列用于开发和使用JMX的工具和实用...
在实际应用中,Catalina JMX远程访问不仅限于基础监控,还可以配合JMX通知机制,实现自动化的运维流程,例如当内存使用超过一定阈值时发送警告,或者在特定条件下自动调整线程池大小。 总之,理解和利用Catalina ...
JMX连接器定义了客户端和服务器之间的交互协议,如JMX Remote Protocol,它支持RMI和HTTP/HTTPS等传输方式。 压缩包中的"jmx_1.1_ri_bin"很可能包含了JMX API的实现库,这些库可以被Java应用程序引入以利用JMX的...
3. JMX Connectors:JMX连接器允许客户端与MBean服务器通信,支持RMI、HTTP、HTTPS等多种协议。 4. Notifications:MBeans可以通过发送通知来通告系统状态的变化,客户端可以订阅这些通知。 5. Attributes, ...
4. **连接器配置**: 可以选择RMI、JNDI或者其他类型的JMX连接器。例如,使用RMI连接器需要设置`-Dcom.sun.management.jmxremote.rmi.port`。 5. **密码和访问文件**: 为了安全,JMX连接通常需要用户名和密码。这些...
总的来说,通过RMI和JMX,我们可以实现对远程JVM的精细管理,从而提高系统的可维护性和稳定性。结合SNMP,还能进一步扩展管理范围,实现更全面的监控。以上就是关于RMI远程连接JVM和使用JMX获取JVM参数的基本知识,...
在本实例中,我们重点关注的是如何使用Remote Method Invocation(RMI)来实现JMX的MBean管理。RMI是一种在Java平台上进行远程调用的技术,使得一个Java对象的方法可以在不同的Java虚拟机(JVM)之间被调用。结合JMX...
这个版本可能包含了RMI(Remote Method Invocation)的实现,这是Java中常用的远程调用协议,用于实现JMX的远程管理。 在使用这些jar文件时,你需要将它们添加到你的Java项目的类路径中。JMX的配置通常涉及到以下...
JMX可以通过定义特定的MBean(Managed Bean)来实现对硬件设备温度的实时监测。例如,可以创建一个名为`DeviceTemperatureMonitor`的MBean,它包含用于读取温度的属性和方法。通过这种方式,管理员可以在不直接访问...
要实现远程监控,需要配置JMX RMI服务,让JMX服务器暴露一个RMI注册表,允许远程客户端连接。这通常涉及到在Java虚拟机(JVM)启动时添加特定的系统属性,如`com.sun.management.jmxremote`、`...
在Zabbix中集成`cmdline-jmxclient`,可以实现对Java应用的指标收集,如CPU使用率、内存占用、线程状态等,并将这些数据展示在Zabbix监控界面,以便实时监控系统性能和健康状况。这对于运维人员来说非常有用,因为...
- RMI JMX连接器服务器:实现JMX代理通过RMI协议接收远程客户端连接。 - RMI JMX连接器客户端:支持JMX客户端通过RMI连接到远程服务器。 - RMI注册表:管理JMX连接器的地址和端口,便于客户端查找和连接。 - ...
【描述】"jmx-rmi-agent.zip, ${project.version}发布" 暗示了这个压缩包可能包含了一个JMX(Java Management Extensions)RMI(Remote Method Invocation)代理。JMX是一种在Java应用程序中管理资源的标准,而RMI是...
它提供了通过RMI(Remote Method Invocation)进行JMX代理的通信机制,使得管理者可以从远程位置监控和管理Java应用程序。 JMX包含以下几个核心概念: - **管理 Beans (MBeans)**:是可管理的Java对象,代表了可被...
1. **远程JMX连接**:Java默认使用Remote Method Invocation (RMI) 协议来实现远程JMX连接。通过设置`-Dcom.sun.management.jmxremote.rmi.port`和`-Dcom.sun.management.jmxremote.port`等参数,可以启用RMI服务,...
在“rmi-jndi-ldap-jrmp-jmx-jms”这个项目中,可能包含了对这些技术的实际应用和测试代码。开发者可能创建了各种示例,如RMI服务端和客户端的交互,JNDI查找和绑定对象到LDAP目录,JRMP的远程调用,JMX监控应用程序...
标签“jmxclient”表明这个工具是JMX的客户端实现,它使得没有图形用户界面(GUI)环境的系统也能访问JMX服务。在某些情况下,例如服务器集群或者自动化脚本中,命令行工具是非常实用的。 在提供的压缩包子文件的...