springBoot使用jmx

一、springBoot添加jmx

package com.study.config;

import java.rmi.registry.Registry;

import javax.management.remote.JMXConnectorServer;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.jmx.export.MBeanExporter;
import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
import org.springframework.jmx.export.naming.MetadataNamingStrategy;
import org.springframework.jmx.support.ConnectorServerFactoryBean;
import org.springframework.jmx.support.RegistrationPolicy;
import org.springframework.remoting.rmi.RmiRegistryFactoryBean;

import lombok.extern.slf4j.Slf4j;

/**
 * FactoryBean fb = new FactroyBean();
 * Bean b = FactoryBean.getObject()
 * 注意:springBoot的@Configuration中只需注入fb这个bean就可以了,不用在注入b这bean了,springBoot会自动将b注入
 * 
 * 
 * <bean id="jmxAttributeSource"
		class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
		
   <bean id="assembler"
		class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
		<property name="attributeSource" ref="jmxAttributeSource" />
	</bean>

	 <!-- 从注解中得到ObjectName  -->  
	<bean id="namingStrategy"
		class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
		<property name="attributeSource" ref="jmxAttributeSource" />
	</bean>
	
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="beans">
			<map>
			</map>
		</property>
		<property name="autodetectModeName" value="AUTODETECT_ALL" />
		<property name="registrationPolicy" value="REPLACE_EXISTING" />
		<property name="assembler" ref="assembler" />
		<property name="namingStrategy" ref="namingStrategy" />
	</bean>
	
	<!-- 配置服务器端连接器RMI -->  
	<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
		<property name="alwaysCreate" value="${rmiRegistry.alwaysCreate}" />
		<property name="port" value="${rmiRegistry.port}" />
	</bean>
	
	
	<bean id="serverConnector"
		class="org.springframework.jmx.support.ConnectorServerFactoryBean"
		depends-on="rmiRegistry">
		<property name="serviceUrl"
			value="service:jmx:rmi://${ip}:${rmiRegistry.port}/jndi/rmi://${ip}:${jmxServer.rmiPort}/jmxDefault" />
	</bean>
 *
 */
@Configuration
@Slf4j
public class JmxConfig {
	
	@Bean("jmxAttributeSource")
	public AnnotationJmxAttributeSource annotationJmxAttributeSource() {
		AnnotationJmxAttributeSource annotationJmxAttributeSource = new AnnotationJmxAttributeSource();
		return annotationJmxAttributeSource;
	}
	
	@Bean("assembler")
	public MetadataMBeanInfoAssembler metadataMBeanInfoAssembler(AnnotationJmxAttributeSource jmxAttributeSource) {
		MetadataMBeanInfoAssembler metadataMBeanInfoAssembler = new MetadataMBeanInfoAssembler();
		metadataMBeanInfoAssembler.setAttributeSource(jmxAttributeSource);
		return metadataMBeanInfoAssembler;
	}
	
	@Bean("namingStrategy")
	public MetadataNamingStrategy metadataNamingStrategy(AnnotationJmxAttributeSource jmxAttributeSource) {
		MetadataNamingStrategy metadataNamingStrategy = new MetadataNamingStrategy();
		metadataNamingStrategy.setAttributeSource(jmxAttributeSource);
		return metadataNamingStrategy;
	}
	
	@Bean("exporter")
	public MBeanExporter mBeanExporter(MetadataNamingStrategy metadataNamingStrategy, 
			MetadataMBeanInfoAssembler metadataMBeanInfoAssembler) {
		MBeanExporter mBeanExporter = new MBeanExporter();
		mBeanExporter.setAutodetectModeName("AUTODETECT_ALL");
		mBeanExporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING);
		mBeanExporter.setAssembler(metadataMBeanInfoAssembler);
		mBeanExporter.setNamingStrategy(metadataNamingStrategy);
		return mBeanExporter;
	}
	
	
	@Bean("rmiRegistryFactoryBean")
	public RmiRegistryFactoryBean rmiRegistryFactoryBean(@Value("${jmx.rmiRegistry.alwaysCreate}") boolean alwaysCreate, 
			@Value("${jmx.rmiRegistry.port}") int port) throws Exception {
		RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
		rmiRegistryFactoryBean.setAlwaysCreate(alwaysCreate);
		rmiRegistryFactoryBean.setPort(port);
		return rmiRegistryFactoryBean;
	}
	
	/**
	 * ConnectorServerFactoryBean.class中默认的jxmUrl
	 * public static final String DEFAULT_SERVICE_URL = "service:jmx:jmxmp://localhost:9875";
	 * 
	 * service:jmx:rmi://172.22.162.206:6300/jndi/rmi://172.22.162.206:6300/jmxDefault
	 *
	 */
	@Bean("jMXConnectorServer")
	public ConnectorServerFactoryBean connectorServerFactoryBean(@Value("${jmx.ip}") String ip, 
			@Value("${jmx.jmxServer.rmiPort}") int rmiPort, 
			@Value("${jmx.rmiRegistry.port}") int port) {
		ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
		String serviceUrl = "service:jmx:rmi://" + ip + ":" + port + "/jndi/rmi://" + ip + ":"
			+ rmiPort + "/jmxDefault";
		
		log.info("jmxUrl: " + serviceUrl);
		connectorServerFactoryBean.setServiceUrl(serviceUrl);
		return connectorServerFactoryBean;
	}
	
}

二、spring通过annotation注册MBean到JMX

作用:可动态的去管理程序

用途Commons Attributes属性JDK 5.0注解属性/注解类型
将类的所有实例标识为JMX受控资源ManagedResource@ManagedResourceClass 类
将方法标识为JMX操作ManagedOperation@ManagedOperationMethod方法
将getter或者setter标识为部分JMX属性ManagedAttribute@ManagedAttributeMethod (only getters and setters) 方法(仅getters和setters)
定义操作参数说明ManagedOperationParameter@ManagedOperationParameter 和@ManagedOperationParametersMethod 方法

三、jvm监控

public static JMXConnector getJMXConnector(String jmxURL, String userName, String password){    	
		JMXConnector conn = null;
		try {
			JMXServiceURL u = new JMXServiceURL(jmxURL);
			if(null != userName && !userName.isEmpty()){
				Map<String, Object> auth = new HashMap<String, Object>();
				auth.put(JMXConnector.CREDENTIALS, new String[] { userName, password });
				conn = JMXConnectorFactory.connect(u, auth);
			}else{
				conn = JMXConnectorFactory.connect(u);	
			}			 
			//			mbs = conn.getMBeanServerConnection();
		} catch (MalformedURLException e) {
			log.error("JMXConnector 认证失败", e);
		} catch (IOException e) {
			log.error("JMXConnector 认证失败", e);
		} catch (SecurityException e) {
			log.error("JMXConnector 认证失败", e);
		} 
		return conn;
}


MXConnector jmxConnector = JvmCheckUtil.getJMXConnector(url, userName, password);

MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();

public static long getHeapSizeUsed_MB(MBeanServerConnection mbeanServer) throws IOException {
    try {
		//获取远程memorymxbean  
		MemoryMXBean memBean=ManagementFactory.newPlatformMXBeanProxy  
				(mbeanServer,ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);  
		MemoryUsage heap = memBean.getHeapMemoryUsage();  
		long heapSizeUsed = heap.getUsed();//堆使用的大小
		long heapSizeUsedMB = byteToMB(heapSizeUsed);
		return heapSizeUsedMB;
    } catch (Exception e) {
			log.error(e.getMessage());
	} finally {
			//关闭连接
			try {
				if(jmxConnector != null) {
					jmxConnector.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				log.error(e.getMessage());
			}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值