`
淘气天空lc
  • 浏览: 46602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMX (三)--------spring整合JMX

阅读更多

http://90haofang-163-com.iteye.com/blog/1901416
http://90haofang-163-com.iteye.com/blog/1902211

JMX的Serverconnetor的编写在之前的博客中已经写了。现在谈谈如何在用spring整合JMX,首先看看spring,JMX的优点。

spring提供了很简便的方式整合JMX到应用程序中,它提供了一下四个特性:
1.自动注册Spring bean为JMX MBean
2.灵活的管理beans 接口机制
3.声明MBean通过远程连接
4.给本地或者远程资源提供了简单代理
这些特性使用起来,与应用程序其他模块没有耦合性,这些模块也不需要知道Spring和JMX的存在。接下来通过一个例子来开始我们的整合,

首先了解MBeanExporter,这个类是spring JMX中的核心类,用于创建好的Spring beans 注册到JMX MBean  server上。使之成为MBean。

先创建一个spring Bean 实现一个接口:

 

package git.tudou.spring.integration.jmx;

/**
 * Date: 13-7-11
 * Time: 上午10:38
 */
public interface IJmxTestBean {
    public int add(int x,int y);
    public long operation();
    public int getAge();
    public void setAge(int age);
    public void setName(String name);
    public String getName();
}
 实现这个接口:

 

 

package git.tudou.spring.integration.jmx;

/**
 * Date: 13-7-11
 * Time: 上午10:43
 */
public class JmxTestBean implements IJmxTestBean{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int add(int x, int y) {
        return x+y;
    }

    public long operation() {
        return 100;
    }
    public void dontExportOperation(){
        throw  new RuntimeException("do not export me");
    }
}
把这个类的方法和属性导出为MBean的方法和属性,只需要在spring配置一个MBeanExporter类, 并把这个类配置到MBeanExporter中。

 

 

<!--导出spring bean所有的方法和属性 不使用赖加载-->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
    <!--需要导出为MBean的spring 类 -->
    <property name="beans">
        <map>
            <entry key="bean:name=testBean" value-ref="testBean"/>
        </map>
    </property>
    <!--<property name="autodetect" value="true"/>-->
    <!--指定export的MBean server -->
    <property name="server" ref="mbeanServer"/>
</bean>

<bean id="testBean" class="git.tudou.spring.integration.jmx.JmxTestBean">
    <property name="name" value="tudou"/>
    <property name="age"  value="10"/>
</bean>
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
相关类定义在以上的配置中,MBeanExporter的beans属性指定要从spring bean导出到MBeans server的类,默认情况下entry的key值作为导出MBean的ObjectName,

 

如果运行环境中有一个MBean server,就可以不配置,这时候spring就会尝试定位这个MBean 并且把导出bean注册在该MBean server上,如果没有需要自己配置一个Mbean server,通过实例化一个org.springframework.jmx.support.MBeanServerFactoryBean ,然后在MBeanExporter中指定server属性,当然我们也可以指定自己私有的MBean server.

然后通过rmi发布MBean供远程应用程序访问,配置如下

spring-config-jmx-server.xml

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="byName">
<!-- -->
<!--导出spring bean所有的方法和属性 不使用赖加载-->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
    <!--需要导出为MBean的spring 类 -->
    <property name="beans">
        <map>
            <entry key="bean:name=testBean" value-ref="testBean"/>
        </map>
    </property>
    <!--<property name="autodetect" value="true"/>-->
    <!--指定export的MBean server -->
    <property name="server" ref="mbeanServer"/>
</bean>

<bean id="testBean" class="git.tudou.spring.integration.jmx.JmxTestBean">
    <property name="name" value="tudou"/>
    <property name="age"  value="10"/>
</bean>
<!--MBean server 实例-->
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
<!--注册端口 我使用的是9992-->
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean" destroy-method="destroy">
        <property name="port" value="9992"/>
</bean>
<!--配置服务连接connector via rmi -->
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
    <property name="objectName"  value="connector:name=rmi"/>
    <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://10.12.145.18:9992/jmxrmi"/>
    <property name="server" ref="mbeanServer"/>
</bean>
</beans>

 这样远程就可以通过rmi访问该MBean了.先编写一个测试类启动MBean server

package git.tudou.spring.jmx.test;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Date: 13-7-11
 * Time: 下午2:34
 */
public class BaseTest {
    protected  static ApplicationContext applicationContext;
    @BeforeClass
    public static  void initApplicationContext() {
         try{
             long start = System.currentTimeMillis();
             System.out.println("正在加载配置文件.....");
             applicationContext = new 
ClassPathXmlApplicationContext(new String[]{"spring-config-jmx-server.xml"});
             System.out.println("加载配置文件完成...时间:" +
 (System.currentTimeMillis() - start));
         }catch (Exception e){
             e.printStackTrace();
         }
    }
    @Before
    public void setAutoWire(){
        applicationContext.getAutowireCapableBeanFactory().autowireBeanProperties(this, DefaultListableBeanFactory.AUTOWIRE_BY_NAME,false);
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("类加载完成......");
    }
}

 

package git.tudou.spring.jmx.test;

import org.junit.Test;

import java.util.concurrent.CountDownLatch;

/**
 * Date: 13-7-11
 * Time: 下午2:29
 */
public class TestSpringJmxServer extends  BaseTest {
    @Test
    public  void testCreateServer() throws Exception{
        CountDownLatch lock = new CountDownLatch(1);
        System.out.println("MBean rmi 服务启动....");
        lock.await();
    }
}

 启动测试类:

 

INFO - JMX connector server started: javax.management.remote.rmi.RMIConnectorServer@2b071e12
DEBUG - Finished creating instance of bean 'serverConnector'
DEBUG - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@209daa17]
DEBUG - Returning cached instance of singleton bean 'lifecycleProcessor'
加载配置文件完成...时间:5408
MBean rmi 服务启动....

 可以使用jconsole连接MBean server先看看MBean,本来想上个截图的,总是传不上去。




 

然后用代码连接MBean,在spring配置文件中,配置JMXConnector,我使用代理方式

spring-config-jmx-client.xml

 

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"
       default-autowire="byName">
<!-- -->
<bean id="testBean2" class="git.tudou.spring.integration.jmx.JmxTestBean"/>
<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
    <property name="connectOnStartup" value="true"/>
    <property name="objectName" value="bean:name=testBean"/>
    <property name="proxyInterface" value="git.tudou.spring.integration.jmx.IJmxTestBean"/>
    <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://10.12.145.18:9992/jmxrmi"/>
</bean>
</beans>
 proxyInterface是导出MBean的接口,serverUrl为MBean通过rmi发布是使用的地址,可以通过代理访问MBean,实际上是作为IJmxTestBean的代理,编写测试类测试

 

 

 

package git.tudou.spring.jmx.test;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Date: 13-7-11
 * Time: 下午4:08
 */
public class BaseTestClient {
    protected  static ApplicationContext applicationContext;
    @BeforeClass
    public static  void initApplicationContext() {
         try{
             long start = System.currentTimeMillis();
             System.out.println("正在加载client配置文件.....");
             applicationContext = new ClassPathXmlApplicationContext(new String[]{"spring-config-jmx-client.xml"});
             System.out.println("加载配置文件完成...时间:" + (System.currentTimeMillis() - start));
         }catch (Exception e){
             e.printStackTrace();
         }
    }
    @Before
    public void setAutoWire(){
        applicationContext.getAutowireCapableBeanFactory().autowireBeanProperties(this, DefaultListableBeanFactory.AUTOWIRE_BY_NAME,false);
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("类加载完成......");
    }
}
 以下类在从spring容器中获得一个代理,并执行MBean的一些方法
package git.tudou.spring.jmx.test;

import git.tudou.spring.integration.jmx.IJmxTestBean;
import org.junit.Test;

import java.util.concurrent.CountDownLatch;

/**
 * User: luochao
 * Date: 13-7-11
 * Time: 下午4:09
 */
public class TestSpringJmxClient extends  BaseTestClient {
    IJmxTestBean proxy;
    @Test
    public void testClient() {
        try{
        System.out.println("客户端启动");
        CountDownLatch statrt = new CountDownLatch(1);
        System.out.println("MBean name:"+proxy.getName());
        System.out.println("调用Mbean的方法:"+proxy.add(1,2));
        CountDownLatch lock = new CountDownLatch(1);
        }catch (Exception e){
            System.out.println(e);
        }
    }
    public void setProxy(IJmxTestBean proxy) {
        this.proxy = proxy;
    }
}
 以下是执行结果,从结果中可以看出,调用了MBean方法getName,add方法并输出了相应的结果
DEBUG - Finished creating instance of bean 'proxy'
DEBUG - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@690ff62a]
DEBUG - Returning cached instance of singleton bean 'lifecycleProcessor'
加载配置文件完成...时间:8855
DEBUG - Returning cached instance of singleton bean 'proxy'
DEBUG - Added autowiring by name from bean name 'git.tudou.spring.jmx.test.TestSpringJmxClient' via property 'proxy' to bean named 'proxy'
客户端启动
MBean name:tudou
调用Mbean的方法:3
类加载完成......
  

出现了以上结果,说明整合成功,spring jmx还提供了很多方式去导出bean,还提供了assembler用于过滤掉一部分方法和属性,有基于annotation,基于接口的,而在以上例子中,spring bean中的所有方法和属性都被导出到MBean中。搭建了第一个实例,就可以在这基础上面做一些应用,我们可以编写简单程序监测tomcat,jvm等等。加油土豆。。


 

 

 

 

 

 

 

 

  • 大小: 85.6 KB
  • 大小: 95 KB
  • 大小: 230.1 KB
分享到:
评论
4 楼 淘气天空lc 2013-09-16  
ruanzy888888 写道
这个我知道,不是和Spring集成
只是一个java 程序
注册这个服务


不过我已经搞定


最近在看阿里的durid监控,我想利用jmx在不改变原来代码的情况下,监控我的DBUtils

druid很不错的数据源,我们也用了一段时间了。
3 楼 ruanzy888888 2013-09-09  
这个我知道,不是和Spring集成
只是一个java 程序
注册这个服务


不过我已经搞定


最近在看阿里的durid监控,我想利用jmx在不改变原来代码的情况下,监控我的DBUtils
2 楼 淘气天空lc 2013-09-09  
这个名字可以自己填,只要注册rmi服务不重复就行了,和hessian类似的
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry"> 
    <property name="objectName"  value="connector:name=rmi"/> 
    <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://10.12.145.18:9992/jmxrmi"/> 
    <property name="server" ref="mbeanServer"/> 
</bean>
1 楼 ruanzy888888 2013-09-09  
service:jmx:rmi:///jndi/rmi://IP:9992/server
服务名server是怎么来的

相关推荐

    spring4.1核心包

    提供的对AspectJ框架的整合,也是A面向切面编程。 AspectJ可用于基于普通Java对象的模块化 注意:aop 和 aspects区别: http://www.oschina.net/translate/comparative_analysis_between_spring_aop_and_aspectj。...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8....

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring攻略PDF版

    因为上传大小的限制,分为两部分上传,这是第二部分,第一部分会在评论中给出链接 绝对是spring攻略中文版第二版 ... 第18章 Spring对JMX、电子邮件和调度的支持   第19章 Spring中的脚本编程 

    Spring攻略中文版PDF

    因为上传大小的限制,分为两部分上传,这是第一部分,第二部分会在评论中给出链接 绝对是spring攻略中文版第二版 ... 第18章 Spring对JMX、电子邮件和调度的支持   第19章 Spring中的脚本编程 

    Spring攻略英文版(附带源码)

    Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 控制反转和容器  ... 第18章 Spring对JMX、电子邮件和调度的支持   第19章 Spring中的脚本编程 

    Struts2 Spring2.5 Hibernate3.2 框架整合所有XML文件

    Struts2 Spring2.5 Hibernate3.2 框架整合所需的所有XML文件内容

    spring chm文档

    2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring 2.0 开发参考手册

    整合 17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring中文帮助文档

    2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 ...

    Spring API

    2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3...

    Spring 5 英文文档全套.7z

    总览 历史,设计理念,反馈,入门。 核心 IoC容器,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP。...远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。 语言能力 Kotlin,Groovy,动态语言。

    Spring攻略(第二版 中文高清版).part1

    第1章 Spring简介 1 1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用...

    Spring攻略(第二版 中文高清版).part2

    第1章 Spring简介 1 1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 06.ssm框架整合思路.avi │ 07.ssm框架整合.avi │ 08.测试工程.avi │ 打开必读.txt │ 淘淘商城第一天笔记.docx │ ├─02.第二天 │ 07.商品类目选择完成.avi │ 01.课程计划.avi │ 02.展示首页.avi │ 03....

    SpringBoot多数据源项目

    基于springboot,多数据源,用druid整合,SpringAop进行数据源切换,包括实现事务切换,内有功能备注

Global site tag (gtag.js) - Google Analytics