最近接触jmx,查了很多资料,资料是很全,下面总结了本地操作jmx,远程发布、远程访问JMX相关示例,希望能帮到你。
转贴请表明原地址:
http://skyteam.iteye.com/blog/1893302
JDK中对每个方法介绍很是详细,所以查看jdk 文档会有很大的惊喜。
在线JDK连接:
http://www.ostools.net/apidocs/apidoc?api=jdk-zh
----------------------本地操作JMX----------------------------------
获取本地MBeanServerConnection
private MBeanServerConnection getServerConnection() throws IOException,
NotBoundException {
Registry registry = LocateRegistry.getRegistry();
RMIServer stub = null;
JMXConnector jmxc = null;
if (stub == null) {
//registry_name 注册访问连接的名字如service:jmx:rmi:///jndi/rmi://127.0.0.1:8888/jcfJmxConnector
stub = (RMIServer) registry.lookup(REGISTRY_NAME);//jcfJmxConnector
}
jmxc = new RMIConnector(stub, null);
jmxc.connect();
return jmxc.getMBeanServerConnection();
}
获得MBean:
private Set<ObjectInstance> findServer()
throws MalformedObjectNameException, NullPointerException {
MBeanServer server = MBeanServerFactory.findMBeanServer(null).get(0);
return server.queryMBeans(new ObjectName([color=red]
"jcf.mbeans:name=*,type=NewServerController"[/color]), null);
}
****需要注意的是queryMBeans支持模糊查询
循环调用
Set<ObjectInstance> mbeans = findServer();
for (Iterator<ObjectInstance> it = mbeans.iterator();it.hasNext();) {
ObjectInstance oi = it.next();
mbsc.invoke(oi.getObjectName(), "start", null, null);
}
获取当前环境(karaf)JMX,将自己ObjectName注册进去
private void startJmxConnServer() throws Exception {
try {
ArrayList<MBeanServer> servers = MBeanServerFactory
.findMBeanServer(null);
System.out.println(servers.size());
MBeanServer mbs = (MBeanServer) servers.get(0);
ObjectName objName = new ObjectName(
"ManagementJmxServer:name=Management");
mbs.registerMBean(new Management(), objName);
} catch (MalformedObjectNameException e) {
throw new Exception(e);
} catch (InstanceAlreadyExistsException e) {
throw new Exception(e);
} catch (MBeanRegistrationException e) {
throw new Exception(e);
} catch (NotCompliantMBeanException e) {
throw new Exception(e);
} catch (Exception e) {
throw new Exception(e);
}
}
------------------------------远程JMX------------------------------------
代码注册:
MBeanServer server = MBeanServerFactory.createMBeanServer();
server.registerMBean(new Management(), new ObjectName("com.travelsky.jcf.management:type=Management"));
JMXServiceURL url = new JMXServiceURL("rmi", "127.0.0.1", 9589,
"/jndi/rmi://localhost:" + 1099 + "/management");
// 调用方法,初始化
Map<String, String[]> environment = new HashMap<String, String[]>();
String[] credentials = new String[] { "karaf", "karaf" };
environment.put("jmx.remote.credentials", credentials);
JMXConnectorServer jmxServer = JMXConnectorServerFactory
.newJMXConnectorServer(url, environment , server);
System.out.println(url);
// 在RMI上注册
LocateRegistry.createRegistry(1099);
jmxServer.start();
----
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// Construct the ObjectName for the MBean we will register
ObjectName name = new ObjectName("com.travelsky.jcf.control:type=NewServerController");
// Create the Hello World MBean
NewServerController mbean = new NewServerController();
// Register the Hello World MBean
mbs.registerMBean(mbean, name);
-----
spring 文件注册
<bean id="jcfServerMBean" class="com.travelsky.jcf.NewServerController" init-method="init"></bean>
<!-- <context:component-scan base-package="com.travelsky.jcf" /> -->
<context:mbean-export default-domain="jcf.mbeans" />
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true"/>
</bean>
<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean" destroy-method="destroy">
<property name="port" value="${jcf.jmx.rmi.port}" />
</bean>
<bean id="jcfJmxServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry">
<property name="objectName" value="connector:name=rmi" />
<property name="serviceUrl" value="service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:${jcf.jmx.rmi.port}/jcfJmxConnector" />
<property name="server" ref="mbeanServer" />
<property name="environment">
<!-- the following is only valid when the sun jmx implementation is used -->
<!-- <map>
<entry key="jmx.remote.x.password.file" value="${user.home}/.secure/jmxremote.password" />
<entry key="jmx.remote.x.access.file" value="${user.home}/.secure/jmxremote.access" />
</map> -->
<props>
<prop key="java.naming.security.principal">${jcf.jmx.rmi.username}</prop>
<prop key="java.naming.security.credentials">${jcf.jmx.rmi.password}</prop>
</props>
</property>
</bean>
<bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean" depends-on="jcfJmxServer">
<property name="serviceUrl" value="service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:${jcf.jmx.rmi.port}/jcfJmxConnector" />
<property name="environment">
<map>
<entry key="jmx.remote.credentials">
<bean class=" org.springframework.util.StringUtils" factory-method="commaDelimitedListToStringArray">
<constructor-arg value="${jcf.jmx.rmi.username},${jcf.jmx.rmi.password}" />
</bean>
</entry>
</map>
</property>
</bean>
访问远程JMX
MBeanServerConnection mbeanServerConnection = null;
JMXConnector jmxConnector = null;
JMXServiceURL serviceURL = new JMXServiceURL(URL);
Map<String, String[]> environment = new HashMap<String, String[]>();
String[] credentials = new String[] { USERNAME, PASSWORD };
environment.put("jmx.remote.credentials", credentials);
jmxConnector = JMXConnectorFactory.connect(serviceURL, environment);
mbeanServerConnection = jmxConnector.getMBeanServerConnection();
ObjectName nodeObjName = new ObjectName(
"jcf.mbeans:name=jcfServerMBean,type=NewServerController");
System.out.println(mbeanServerConnection.invoke(nodeObjName, "getRepository", new Object[] { "String1" };new String[] { String.class.getName() }));
package test;
import java.util.Iterator;
import java.util.Set;
import javax.management.Attribute;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("chengang:name=HelloWorld");
// 把所有Domain都打印出来
System.out.println("Domains:---------------");
String domains[] = mbsc.getDomains();
for (int i = 0; i < domains.length; i++) {
System.out.println("\tDomain[" + i + "] = " + domains[i]);
}
// MBean的总数
System.out.println("MBean count = " + mbsc.getMBeanCount());
// 对name属性的操作(属性名的第一个字母要大写)
mbsc.setAttribute(mbeanName, new Attribute("Name", "Chen.Gang"));// 设值
System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));// 取值
// 得到proxy代理后直接调用的方式
HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler
.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
proxy.printHello();
proxy.printHello("陈刚");
// 远程调用的方式
mbsc.invoke(mbeanName, "printHello", null, null);
mbsc.invoke(mbeanName, "printHello", new Object[] { "子在川上曰" },
new String[] { String.class.getName() });
// 得mbean的信息
MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
System.out.println("Hello Class: " + info.getClassName());
System.out.println("Hello Attriber:"
+ info.getAttributes()[0].getName());
System.out.println("Hello Operation:"
+ info.getOperations()[0].getName());
// 得到所有的MBean的ObjectName
System.out.println("all ObjectName:---------------");
Set<ObjectInstance> set = mbsc.queryMBeans(null, null);
for (Iterator<ObjectInstance> it = set.iterator(); it.hasNext();) {
ObjectInstance oi = (ObjectInstance) it.next();
System.out.println("\t" + oi.getObjectName());
}
}
// 注销
// mbsc.unregisterMBean(mbeanName);
// 关闭MBeanServer连接jmxc.close();
}
分享到:
相关推荐
首先,`cmdline-jmxclient-0.10.3.jar`是一个Java管理扩展(JMX)客户端,它允许通过命令行接口连接到Tomcat服务器,获取和操作JMX MBeans(管理Bean),从而获取Tomcat的运行时信息,如线程池状态、内存使用情况、...
`cmdline-jmxclient-0.10.3.jar` 是一个用于命令行接口的Java管理扩展(JMX)客户端工具,版本号为0.10.3。JMX(Java Management Extensions)是Java平台的一个核心特性,它提供了一种标准的方式来管理和监控Java...
首先,`cmdline-jmxclient-0.10.3.jar`是一个命令行Java Management Extensions (JMX)客户端,它允许通过JMX协议远程访问和管理Java应用程序,如Tomcat。JMX是一种标准的Java技术,用于管理和监控Java应用程序的运行...
标题“cmdline-jmxclient.zip”指的是一个包含命令行界面的Java管理扩展(JMX)客户端工具,这个工具主要用于远程连接并监控Java虚拟机(JVM)以及运行在其中的应用,比如Tomcat服务器。JMX是一种Java平台提供的标准...
tomcat9监控jar包,catalina-jmx-remote java-visualVM专用
tomcat8监控jar包,catalina-jmx-remote java-visualVM专用
`cmdline-jmxclient-0.10.3.jar.zip` 是一个用于Tomcat性能监控的工具包,其中包含 `cmdline-jmxclient-0.10.3.jar` 文件,这是一个Java档案(JAR)文件,专门设计用于通过命令行界面与Java管理扩展(JMX)接口交互...
标题中的"cmdline-jmxclient-0.10.3.jar"和"KafkaOffsetMonitor-assembly-0.2.0.jar"是两个在Java环境中使用的工具,它们与Apache Kafka的管理和监控紧密相关。让我们详细了解一下这两个工具及其背后的原理。 JMX ...
标题 "sycdtk-cmdline-jmxclient-master_java_" 暗示这是一个关于Java的项目,特别是涉及命令行界面(cmdline)和Java管理扩展(JMX)客户端的实现。JMX是一种在Java应用程序中管理和监控管理资源的标准机制。这个...
tomcat7监控jar包,catalina-jmx-remote java-visualVM专用
标题“cmdline-jmxclient-0.10.3”指的是一个特定版本的命令行JMX客户端工具,这个工具主要用于与Java Management Extensions (JMX)接口进行交互,从而获取JMX相关的各种信息。JMX是一种Java平台的标准,它提供了一...
`catalina-jmx-remote.rar`这个压缩包文件,显然与通过JMX远程访问Catalina相关,让我们深入探讨一下这个主题。 首先,理解JMX的原理和作用是至关重要的。JMX允许开发者创建和注册管理对象(MBeans),这些对象代表...
Groovy-JMX 2.1.7 和 Azure SDK for Java 是两个不同的软件开发工具,但它们都与Java编程和云计算紧密相关。Groovy-JMX是一个用Groovy语言编写的Java管理扩展(JMX)库,而Azure SDK for Java是微软为开发Azure云...
《深入理解Java代理与JMX技术:以agent-jmx-2.2.1.jar.zip为例》 在Java世界中,代理(Agent)和Java管理扩展(JMX, Java Management Extensions)是两个重要的技术概念,它们在系统管理和监控方面发挥着核心作用。...
jbaoo4.2.3-jmx-console未授权访问
标签:agent-jmx-3.0.1-javadoc.jar,agent,jmx,3.0.1,javadoc,jar包下载,依赖包
《深入理解Java代理与JMX技术:以agent-jmx-2.1.6.jar.zip为例》 在Java世界中,代理(Agent)和Java管理扩展(JMX, Java Management Extensions)是两个重要的概念,它们在复杂的系统管理和监控中发挥着至关重要的...
此外,OpenJDK 1.8.0 还支持JMX(Java Management Extensions)和JFR(Java Flight Recorder),它们是用于监控和诊断Java应用程序的工具。JMX允许管理和监控各种Java应用程序的资源,而JFR则提供了一种低开销的方式...
Java Management Extensions(JMX)是Java平台标准版(Java Platform, Standard Edition)的一部分,提供了一个强大的管理和监控Java应用程序的框架。JMX允许开发者编写管理代理程序,监控和控制Java应用程序的状态...
Zabbix Java Gateway的主要任务是为Zabbix Server提供对Java应用程序和JMX(Java Management Extensions)接口的访问能力。通过这个Gateway,你可以监控Java应用服务器的性能指标,如内存使用、线程状态、类加载情况...