`
antxman
  • 浏览: 40701 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
最近接触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();

}
分享到:
评论

相关推荐

    zabbix监控tomcat所需的cmdline-jmxclient-0.10.3.jar和zbx自定义模版

    首先,`cmdline-jmxclient-0.10.3.jar`是一个Java管理扩展(JMX)客户端,它允许通过命令行接口连接到Tomcat服务器,获取和操作JMX MBeans(管理Bean),从而获取Tomcat的运行时信息,如线程池状态、内存使用情况、...

    cmdline-jmxclient-0.10.3.jar

    `cmdline-jmxclient-0.10.3.jar` 是一个用于命令行接口的Java管理扩展(JMX)客户端工具,版本号为0.10.3。JMX(Java Management Extensions)是Java平台的一个核心特性,它提供了一种标准的方式来管理和监控Java...

    cmdline-jmxclient-0.10.3.jar + zabbix tomcat监控模板

    首先,`cmdline-jmxclient-0.10.3.jar`是一个命令行Java Management Extensions (JMX)客户端,它允许通过JMX协议远程访问和管理Java应用程序,如Tomcat。JMX是一种标准的Java技术,用于管理和监控Java应用程序的运行...

    cmdline-jmxclient.zip

    标题“cmdline-jmxclient.zip”指的是一个包含命令行界面的Java管理扩展(JMX)客户端工具,这个工具主要用于远程连接并监控Java虚拟机(JVM)以及运行在其中的应用,比如Tomcat服务器。JMX是一种Java平台提供的标准...

    tomcat9监控jar包,catalina-jmx-remote java-visualVM专用

    tomcat9监控jar包,catalina-jmx-remote java-visualVM专用

    tomcat8监控jar包,catalina-jmx-remote java-visualVM专用

    tomcat8监控jar包,catalina-jmx-remote java-visualVM专用

    cmdline-jmxclient-0.10.3.jar.zip

    `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

    标题中的"cmdline-jmxclient-0.10.3.jar"和"KafkaOffsetMonitor-assembly-0.2.0.jar"是两个在Java环境中使用的工具,它们与Apache Kafka的管理和监控紧密相关。让我们详细了解一下这两个工具及其背后的原理。 JMX ...

    sycdtk-cmdline-jmxclient-master_java_

    标题 "sycdtk-cmdline-jmxclient-master_java_" 暗示这是一个关于Java的项目,特别是涉及命令行界面(cmdline)和Java管理扩展(JMX)客户端的实现。JMX是一种在Java应用程序中管理和监控管理资源的标准机制。这个...

    tomcat7监控jar包,catalina-jmx-remote java-visualVM专用

    tomcat7监控jar包,catalina-jmx-remote java-visualVM专用

    cmdline-jmxclient-0.10.3

    标题“cmdline-jmxclient-0.10.3”指的是一个特定版本的命令行JMX客户端工具,这个工具主要用于与Java Management Extensions (JMX)接口进行交互,从而获取JMX相关的各种信息。JMX是一种Java平台的标准,它提供了一...

    catalina-jmx-remote.rar

    `catalina-jmx-remote.rar`这个压缩包文件,显然与通过JMX远程访问Catalina相关,让我们深入探讨一下这个主题。 首先,理解JMX的原理和作用是至关重要的。JMX允许开发者创建和注册管理对象(MBeans),这些对象代表...

    groovy-jmx-2.1.7.zip

    Groovy-JMX 2.1.7 和 Azure SDK for Java 是两个不同的软件开发工具,但它们都与Java编程和云计算紧密相关。Groovy-JMX是一个用Groovy语言编写的Java管理扩展(JMX)库,而Azure SDK for Java是微软为开发Azure云...

    agent-jmx-2.2.1.jar.zip

    《深入理解Java代理与JMX技术:以agent-jmx-2.2.1.jar.zip为例》 在Java世界中,代理(Agent)和Java管理扩展(JMX, Java Management Extensions)是两个重要的技术概念,它们在系统管理和监控方面发挥着核心作用。...

    jbaoo4.2.3-jmx-console未授权访问.docx

    jbaoo4.2.3-jmx-console未授权访问

    agent-jmx-3.0.1-javadoc.jar

    标签:agent-jmx-3.0.1-javadoc.jar,agent,jmx,3.0.1,javadoc,jar包下载,依赖包

    agent-jmx-2.1.6.jar.zip

    《深入理解Java代理与JMX技术:以agent-jmx-2.1.6.jar.zip为例》 在Java世界中,代理(Agent)和Java管理扩展(JMX, Java Management Extensions)是两个重要的概念,它们在复杂的系统管理和监控中发挥着至关重要的...

    java-1.8.0-openjdk.linux.x86_64

    此外,OpenJDK 1.8.0 还支持JMX(Java Management Extensions)和JFR(Java Flight Recorder),它们是用于监控和诊断Java应用程序的工具。JMX允许管理和监控各种Java应用程序的资源,而JFR则提供了一种低开销的方式...

    JDK17-java-management-extensions-guide.pdf

    Java Management Extensions(JMX)是Java平台标准版(Java Platform, Standard Edition)的一部分,提供了一个强大的管理和监控Java应用程序的框架。JMX允许开发者编写管理代理程序,监控和控制Java应用程序的状态...

    zabbix-java-gateway.tar.zip

    Zabbix Java Gateway的主要任务是为Zabbix Server提供对Java应用程序和JMX(Java Management Extensions)接口的访问能力。通过这个Gateway,你可以监控Java应用服务器的性能指标,如内存使用、线程状态、类加载情况...

Global site tag (gtag.js) - Google Analytics