1.什么是JMX

JMX可以监控类的运行情况,可以在程序运行期查看并修改类属性的信息。

举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢?

  下面是一段摘自http://blog.csdn.net/xiaojianpitt/article/details/2961695

程序初哥一般是写死在程序里,到要改变时就去改程序,然后再编译发布;

程序熟手则一般把这些信息写在一个配置文件里(JAVA一般都是*.properties文件),到要改变时只要改配置文件,但还是重新启动系统,以便读取配置文件里的新值;

程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有没有更动。如有更改则重读一遍,否则从缓存里读取值

程序高手则懂得取物为我所用,用JMX把配置属性集中在一个类,然后写一个叫MBean的东东,再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些配置信息。

  使用JMX可以在不影响程序运行的情况下根据访问量去修改数据库连接池的大小。

  我们可以自己编写代码基于JMX监控类的运行情况,也可以基于Spring去监控Bean的运行情况,还可以监控activemq,查看消息的接收情况。

2.自己编写JMX代码

编写接口,类名的结尾都是MBean

public interface HelloMBean
{
public String getName();
public void setName(String name);
public void print();
public void print(String str);
}

编写需要监控的类,继承HelloMBean接口

public class Hello implements HelloMBean
{
private String m_name = "scorpio";
@Override
public String getName()
{
return m_name;
} @Override
public void setName(String name)
{
m_name = name;
} @Override
public void print()
{
System.out.println("Hello "+m_name);
} @Override
public void print(String str)
{
System.out.println("hello"+str);
}
}

  编写监控类的代码,监控上面的java类

public class JmxService
{
public static void main(String[] args)
{
MBeanServer jmxServer = MBeanServerFactory.createMBeanServer();
MBeanServer jconsolJmxServer = ManagementFactory.getPlatformMBeanServer();
HelloMBean helloMBean = new Hello();
ObjectName helloName = null;
try
{
//jmx:rmi:///jndi/rmi://localhost:8888/jmxrmi
LocateRegistry.createRegistry(8888);
helloName = new ObjectName("raisecom.com:name=scorpio,type=Echo");
jmxServer.registerMBean(helloMBean, helloName);
jconsolJmxServer.registerMBean(helloMBean, helloName);
JMXServiceURL jmxURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8888/server");
JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxURL, null, jmxServer);
jmxConnectorServer.start();
Thread.sleep(Long.MAX_VALUE);
System.out.println("start");
} catch (MalformedObjectNameException e)
{
e.printStackTrace();
} catch (NullPointerException e)
{
e.printStackTrace();
} catch (InstanceAlreadyExistsException e)
{
e.printStackTrace();
} catch (MBeanRegistrationException e)
{
e.printStackTrace();
} catch (NotCompliantMBeanException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} catch (InterruptedException e)
{
e.printStackTrace();
} }
}

可以修改name属性的值,再调用print方法就可以看到修改的结果。这样就可以在程序运行期动态地做出改变。

也可以基于RMI的方式登陆:

service:jmx:rmi:///jndi/rmi://localhost:8888/server

3.基于JMX监控Spring的Bean

<!-- 需要监控的类  -->
<bean id = "mbeanExporter" class = "org.springframework.jmx.export.MBeanExporter">
<property name = "beans">
<map>
<entry key = "spitter:name=Controller" value-ref = "baseController"/>
</map>
</property>
<property name = "assembler" ref = "assembler"/>
</bean>
<!-- 控制需要监控类的属性 -->
<bean id = "assembler" class = "org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
<property name = "managedMethods">
<set>
<value>setPageSize</value>
<value>getPageSize</value>
</set>
</property>
</bean>

  可以和自己写代码基于JMX监控和修改Java类的属性一样,我们可以通过JMX监控及修改Spring的Bean的属性。

4.使用JMX监控activemq  

1、默认JMX功能是没有打开的,需要在activemq.xml的broker配置上添加useJmx="true"

2、需要在managementContext里,修改为createConnector="true",(同时这里也可以修改jmx的端口和domain)

  默认情况下,ActiveMQ使用useJmx后,jmx的url为

  service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi

  这时,jmx的MBean server被绑死在localhost上,无法在broker所在机器以外的机器访问。

  其实ActiveMQ提供了jmx相关的几个配置,不仅可以调整这个url中的ip和端口,还可以使用其他的MBean server。

属性名称 默认值 描述
useMBeanServer true 为true则避免创建一个MBeanServer,使用jvm中已有的MBeanServer
jmxDomainName org.apache.activemq jmx域,所有ObjectName的前缀
createMBeanServer true 为true则在需要时创建一个MBeanServer
createConnector true 为true则创建一个JMX connector
connectorPort JMX connector的端口
connectorHost localhost JMX connector和RMI server(rmiServerPort>0)的host
rmiServerPort RMI server的端口(便于穿过防火墙)
connectorPath /jmxrmi JMX connector注册的路径
findTigerMBeanServer true 启用或禁用查找Java 5 平台的 MBeanServer

  其他需要修改的地方如下:

ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=8888"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote" ACTIVEMQ_SUNJMX_CONTROL="service:jmx:rmi:///jndi/rmi://localhost:8888/server admin activemq"

  修改完后使用JConsole既可以监控activemq消息的情况了。

JMX与Spring的更多相关文章

  1. Spring JMX之一:使用JMX管理Spring Bean

    spring中关于jmx包括几个概念: MBeanExporter: 从字面上很容易理解, 用来将一些spring的bean作为MBean暴露给MBEanServer.MBeanServerFacto ...

  2. 第20章-使用JMX管理Spring Bean

    Spring对DI的支持是通过在应用中配置bean属性,这是一种非常不错的方法.不过,一旦应用已经部署并且正在运行,单独使用DI并不能帮助我们改变应用的配置.假设我们希望深入了解正在运行的应用并要在运 ...

  3. 使用 Spring Boot 快速构建 Spring 框架应用--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...

  4. Spring 4 官方文档学习 Spring与Java EE技术的集成

    本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...

  5. 玩转spring boot——properties配置

    前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...

  6. 【转】Spring websocket 使用

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html https://spr ...

  7. 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  8. 2015第29周六Spring

    搜了一下Spring相关的经典书籍: <Spring实战(第3版)>从核心的Spring.Spring应用程序的核心组件.Spring集成3个方面,由浅入深.由易到难地对Spring展开了 ...

  9. spring boot application.properties 属性详解

    2019年3月21日17:09:59 英文原版: https://docs.spring.io/spring-boot/docs/current/reference/html/common-appli ...

随机推荐

  1. java初学

    1.Scanner类 1)使用 a.导入Scanner类 improt java.util.Scanner; b.创建Scanner对象 Scanner input = new Scanner(Sys ...

  2. css3 样式 圆角

    第一次学习css3 现在总结一下,方便以后查看: 1.border-radius:25px; 这个用来增加圆角属性 2.CSS3边框阴影 在 CSS3 中,box-shadow 用于向方框添加阴影: ...

  3. JXLS 2.4.0系列教程(五)——更进一步的应用和页面边距bug修复

    注:本文代码建立于前面写的代码.不过不看也不要紧. 前面的文章把JXLS 2.4.0 的基本使用写了一遍,现在讲讲一些更进一步的使用方法.我只写一些我用到过的方法,更多的高级使用方法请参考官网. ht ...

  4. [20160711][neven代码移植Windows]

    相关说明 neven代码用于人脸检测,该代码是从Android源代码中抽取出来的,可以在Linux系统下通过make命令直接进行编译,并且可以通过代码中opencv目录下的测试文件进行测试. 移植环境 ...

  5. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  6. Sql Server——约束

    约束是什么: 每个人都在网站或者APP上注册过账号,在注册账号时会限制用户名.密码等格式,如果格式不对就不能注册.在数据库中我们可以通过约束来进行限制,超过约束范围的数据就不能写入. 约束的种类: 主 ...

  7. 20170723-Ioc与AOP

    Ioc与AOP 功能.语法.分类.原理.例子.补充(AOP-Ioc-DI) 1.AOP: ①功能体现:是拦截,过滤器: ②相关语法:借助特性语法作为切入点: ③实现方式分类:动态代理+静态织入: ④实 ...

  8. Android 社区App 《窝吧》开源分享

    一整个社区模式App的整套代码,包括发布动态,添加.删除好友,添加黑名单,聊天,用户反馈等功能. 相关技术 1 底层使用Bmob后端云,官网: https://www.bmob.cn/ 2 友盟插件, ...

  9. 解决spring定时任务执行2次和tomcat部署缓慢的问题

    spring定时任务执行2次 问题重现和解析 最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次.经过搜索发现是服务器上tomcat的配置文 ...

  10. kafka和strom集群的环境安装

    前言 storm和kafka集群安装是没有必然联系的,我将这两个写在一起,是因为他们都是由zookeeper进行管理的,也都依赖于JDK的环境,为了不重复再写一遍配置,所以我将这两个写在一起.若只需一 ...