20.6. 通过代理访问MBean

Spring JMX允许你创建代理,将调用重新路由到本地或者远程 MBeanServer 上注册的MBean。 这些代理提供了一个标准Java接口,你可以通过它与MBean交互。以下代码展示了如何为本地 MBeanServer 配置一个MBean代理:

<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
    <property name="objectName" value="bean:name=testBean"/>
    <property name="proxyInterface" value="org.springframework.jmx.IJmxTestBean"/>
</bean>

你可以看到已经为以 ObjectName:bean:name=testBean 注册的MBean创建了一个代理, 该代理实现的所有接口都由 proxyInterfaces 和映射规则掌控。 也就是将这些接口上方法,属性映射为MBean上操作与属性的规则,它们与 InterfaceBasedMBeanInfoAssembler 使用的是同一套规则。

MBeanProxyFactoryBean 能创建一个任何MBean的代理,可以通过 MBeanServerConnection 来访问。 默认将定位,使用本地的 MBeanServer。但是,为了适应指向远程MBean的代理,你可以重载这种行为,提供一个指向远程 MBeanServerMBeanServerConnection

<bean id="clientConnector"
      class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean">
  <property name="serviceUrl" value="service:jmx:rmi://remotehost:9875"/>
</bean>

<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
  <property name="objectName" value="bean:name=testBean"/>
  <property name="proxyInterface" value="org.springframework.jmx.IJmxTestBean"/>
  <property name="server" ref="clientConnector"/>
</bean>

你可以看到我们用 MBeanServerConnectionFactoryBean 构建了一个 MBeanServerConnection 指向一个远程主机。 这个 MBeanServerConnection 之后通过 server 属性传给了 MBeanProxyFactoryBean。 创建的这个代理将通过 MBeanServerConnection 把所有调用转发给 MBeanServer