JMX与Spring

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 1099 JMX connector的端口
connectorHost localhost JMX connector和RMI server(rmiServerPort>0)的host
rmiServerPort 0 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消息的情况了。

时间: 2024-10-06 01:30:18

JMX与Spring的相关文章

玩转spring boot——properties配置

前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连接,若有一处配错或遗漏,就会带来不可挽回的损失.正因为这样,spring boot给出了非常理想的解决方案——application.properties.见application-properties的官方文档:http://docs.spring.io/spring-boot/docs/curr

Spring Boot Cookbook 中文笔记

Spring Boot Cookbook 一.Spring Boot 入门 Spring Boot的自动配置.Command-line Runner RESTful by Spring Boot with MySQL Spring Boot:Data Rest Service 二.配置Web应用 Spring Boot:定制servlet filters Spring Boot:定制拦截器 Spring Boot:定制HTTP消息转换器 Spring Boot:定制PropertyEditors

【转】Spring websocket 使用

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html https://spring.io/guides/gs/messaging-stomp-websocket/ https://github.com/rstoyanchev/spring-websocket-portfolio 项目中用到了消息的实时推送,查资料后用到了Spring websocket,找了很多资料,还是感

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

原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面.如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题.每个子项目都有一定

2015第29周六Spring

搜了一下Spring相关的经典书籍: <Spring实战(第3版)>从核心的Spring.Spring应用程序的核心组件.Spring集成3个方面,由浅入深.由易到难地对Spring展开了系统的讲解,包括Spring之旅.装配Bean.最小化Spring XML配置.面向切面的Spring.征服数据库.事务管理.使用Spring MVC构建Web应用程序.使用Spring Web Flow.保护Spring应用.使用远程服务.为Spring添加REST功能.Spring消息.使用JMX管理Sp

Spring boot配置文件application.properties

# =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application.               ^^^ # =====================

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

Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面.如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题.每个子项目都有一定的学习曲线.开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案.在如何使用这些组件上

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

本部分覆盖了一下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Enterprise JavaBeans (EJB) integration -- EJB集成 Chapter 30, JMS (Java Message Service) -- JMS (Java 消息服务) Chapter 31, JMX Chapter 32, JCA CCI Chapter 33,

理解Spring Boot

理解Spring Boot 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot是一个偏执的开源框架,它可用于创建可执行的Spring应用程序,采用了习惯优于配置的方法. 此框架的神奇之处在于@EnableAutoConfiguration注释,此注释自动载入应用程序所需的所有Bean--这依赖于Spring Boot在类路径中的查找. 一.@Enable*注释 @Enable*注释并不是新发明的注