JMX笔记(一)

上篇 JMX初体验 使用HtmlAdaptorServer提供的界面实现了调用MBean,除此之外,还可以使用rmi方式连接调用MBeanServer

要连接,自然要有url:service:jmx:rmi://localhost:5000/jndi/rmi://localhost:6000/jmxrmi

解释下:

  • service:jmx: 这个是JMX URL的标准前缀,所有的JMX URL都必须以该字符串开头。
  • rmi: 这个是connector server的传输协议,在这个url中是使用rmi来进行传输的。JSR 160规定了所有connector server都必须至少实现rmi传输,是否还支持其他的传输协议依赖于具体的实现。比如MX4J就支持soap、soap+ssl、hessian、burlap等等传输协议。
  • localhost:5000: 这个是connector server的IP和端口,这个端口可以称之为数据端口,该部分是一个可选项,如果省略的话,则connector server会随机任意选择一个可用的端口。
  • /jndi/rmi://localhost:6000/jmxrmi: 这个是connector server的路径,具体含义取决于前面的传输协议。比如该URL中这串字符串就代表着该connector server的stub是使用jndi api绑定在rmi://localhost:6000/jmxrmi这个地址。 这里的端口称之为通讯端口

理清一个思路:MBean注册在MBeanServer上-》JMXConnectorServer 关联MBeanServer使用jndi绑定在rmiregistry的rmi://localhost:6000/jmxrmi地址,并使用5000端口传输数据-》rmiregistry监听6000端口

先看下直接在jse下使用jmx

服务器端:

     //在指定端口上启动远程对象注册服务程序,启用RMI,对应于 JAVA_HOME/bin/rmiregistry.exe
        LocateRegistry.createRegistry(9797);
        // MBeanServer mbs = MBeanServerFactory.createMBeanServer();//不能在jconsole中使用
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();//可在jconsole中使用
        //创建MBean
        HelloMBean mb = new Hello();
        //将MBean注册到MBeanServer中
        mbs.registerMBean(mb, new ObjectName("MyappMBean:name=controller"));

        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9797/h-server");
        JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
        cs.start();

客户端:

@Test
    public  void jmxClient() throws IOException, MalformedObjectNameException {
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9797/h-server");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        HelloMBean helloMb = JMX.newMBeanProxy(mbsc,new ObjectName( "MyappMBean:name=controller" ),HelloMBean.class );
        System.out.println("client call:"+helloMb.sayHello());
        jmxc.close();
    }

现在的项目都离不开spring了,如果jmx不能够整合到spring,总显得不伦不类,网上参考了许多就是没成功,总算是熟悉了直接使用jmx,摸着石头过河总算过来了

server端配置

为了避免不必要的麻烦,自己定义个MBeanServer,大部分情况下,我们的bean并不是实现MBean结尾的接口,普通bean更常见,所以我用了MBeanExporter的beans属性进行手动注册

<bean id="mbServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
    <bean id="mbExporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">     <property name="beans">     <map>       <entry key="MyappMBean:name=controller" value-ref="ffmMendService"/>     </map>     </property>     <property name="server" ref="mbServer"/>   </bean>
    <bean id="jmxConnectorServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
        <property name="objectName">
            <value>connector:name=rmi</value>
        </property>
        <property name="serviceUrl">
            <value>service:jmx:rmi:///jndi/rmi://127.0.0.1:9797/ffmservice</value>
        </property>
        <property name="environment">
            <map>
            </map>
        </property>
        <property name="server" ref="mbServer"/>
    </bean>
    <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="port">
            <value>9797</value>
        </property>
    </bean>

注意说明:

1. lazy-init="false",这里一定不能设置成true,否则客户端会报”MyappMBean:name=controller找不到“异常

客户端配置:

我不想在客户端定义服务接口,所以我使用了MBeanServerConnectionFactoryBean,等同于不用spring时

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9797/h-server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

获取了mbsc,而没用MBeanProxyFactoryBean

<bean id="jmxSCFB" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean">  <property name="connectOnStartup" value="false" />  <property name="serviceUrl">     <value>service:jmx:rmi:///jndi/rmi://127.0.0.1:9797/ffmservice</value>   </property> </bean>

参考文章

1. jmx rmi 穿越防火墙问题及jmxmp的替代方案

2.MXBean(示例,出错代码)

3. Spring与JMX集成

4. JMX API

时间: 2024-08-29 05:49:55

JMX笔记(一)的相关文章

JMX学习笔记(一)-MBean

来源:http://blog.csdn.net/qiao000_000/article/details/6061808 JMX        即 Java Management Extensions   Java管理扩展MBean   即 managed beans                         被管理的Beans 一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备.一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口

[笔记&amp;轮子]java源码 生成本地javadoc api文档

在用Eclipse写java代码时候,有时候因为不知道一个java函数的作用,会通过把鼠移动到java函数上,如果它有javadoc的相关内容就会显示出来.但是并非所有java代码都有javadoc:即使安装了javadoc,在eclipse中如果不进行设定,也可能无法使用. 我在win7下安装的是javase的jdk,发现eclipse中默认的javadoc路径是http://download.oracle.com/javase/7/docs/api/,显然这是一个在线资源,问题是网络总是不稳

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

Docker 学习笔记【2】 Docker 基础操作实,Docker仓库、数据卷,网络基础学习

Docker 学习笔记[3] Docker 仓库实操,创建私有仓库,实操数据卷.数据卷容器,实操 网络基础  ---------高级网络配置和部分实战案例学习 ============================================================= Docker 学习笔记[1]Docker 相关概念,基本操作--------实操记录开始 ============================================================= 被

我的笔记---jmeter之badboy工具录制脚本进行测试

真是郁闷了,做个笔记到论坛上字数限制. 机制的我截个图,放到博文中说是空余太多,本来想来两种方式做个对比分析的,字数不让呐!!!                                                    一 用badboy工具进行录制                                                                                                                      

springmvc学习笔记---idea创建springmvc项目

前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2.x到现在4.x, 一眨眼已是二代的积淀. 本文想借助Idea, 来简单搭建一个基于springmvc的web程序, 一为体验, 二为技术积累. 环境配置: idea版本为14.0.2, tomcat版本为8.0.23, idea创建的springmvc为4.1.1.RELEASE. 网上有很多图文并

Memcached笔记——(二)XMemcached&amp;Spring集成

今天研究Memcached的Java的Client,使用XMemcached 1.3.5,做个简单的测试,并介绍如何与Spring集成. 相关链接: Memcached笔记——(一)安装&常规错误&监控Memcached笔记——(二)XMemcached&Spring集成 Memcached笔记——(三)Memcached使用总结 Memcached笔记——(四)应对高并发攻击  一.Memcached Client简要介绍 Memcached Client目前有3种: Memca

zabbix-2.2使用笔记

[zabbix2.2以上命令构成]/usr/local/src ★zabbix_server:Zabbix服务端的核心程序,zabbix服务端守护进程.zabbix_agentd.zabbix_get.zabbix_sender.zabbix_proxy.zabbix_java_gateway的数据最终都是提交到server 备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据. ★zabbix_agentd:以独立进程的方式来启动,对应的配置文件为zab

Spring3.0官网文档学习笔记(一)

Part 1 Spring框架概述 Spring是模块化的,在应用中只需要引入你所需要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web service访问你的逻辑,还有许多种方式保存数据. spring被设计成非侵入式的. 1.Spring框架简介 Spring框架提供了应用开发的基础部分,使得我们可以集中精神在业务开发层上. POJOS:plain old Java objects Spring允许创建非侵入式的POJO.这个特性支持Ja