用户工具

站点工具


code:java:jmx-in-virgo

Virgo 平台中使用 JMX

Spring DM 中有两种比较简单的方式使用 JMX 技术,一种是通过配置 org.springframework.jmx.export.MBeanExporter 来导出 MBean; 另一种则是作为 Spring Remoting 支持的一部分,通过 org.springframework.remoting.rmi.RmiProxyFactoryBean 来导出服务,并且屏蔽掉 JMX 里的 MBeanServer 等细节。

看起来使用第二种方式更加简单,比如我可能只需要做以下一点配置

<bean id="checkBean" class="org.isouth.demo.jmx.CheckImpl"></bean>
 
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="CheckService" />
    <property name="service" ref="checkBean" />
    <property name="serviceInterface" value="org.isouth.demo.jmx.ICheck" />
    <property name="registryPort" value="1099" />
</bean>

不过很可惜,在同时有多个想通过 JMX 远程调用(管理)的服务存在时,这里可能会遇到一些问题: JDK 1.6.0_29 以上版本,多个 RmiServiceExporter 复用一个 registryPort 会导致因为 Security Manager 的原因, RMI Registry 无法加载 Class,但是一个服务使用一个端口是不能被接受的啊!

所以,不要用那么高端的了吧,老老实实导出 MBean 到 MBeanServer吧。

服务端在 Virgo 环境里

1、注册 MBean

你知道吧

<bean id="checkBean" class="org.isouth.demo.jmx.CheckImpl"></bean>

2、获得平台 MBeanServer

<!-- agentId 为 "" 会返回 platform MBeanServer -->
<bean id="mbeanServer" class="org.springframework.jmx.suppMBeanServerFactoryBe
    <property name="locateExistingServerIfPossible" value=e"></property>
    <property name="agentId" value=""></property>
</bean>

3、导出 MBean

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
    lazy-init="false">
    <property name="beans">
        <map>
            <entry key="org.isouth:name=checkBean" value-ref="checkBean" />
        </map>
    </property>
    <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING" />
    <property name="server" ref="mbeanServer" />
</bean>

客户端主动创建 Spring 容器

code/java/jmx-in-virgo.txt · 最后更改: 2018/12/31 18:41 (外部编辑)