一、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 | @ManagedResource | Class 类 |
将方法标识为JMX操作 | ManagedOperation | @ManagedOperation | Method方法 |
将getter或者setter标识为部分JMX属性 | ManagedAttribute | @ManagedAttribute | Method (only getters and setters) 方法(仅getters和setters) |
定义操作参数说明 | ManagedOperationParameter | @ManagedOperationParameter 和@ManagedOperationParameters | Method 方法 |
三、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());
}
}
}