20.2.1 暴露远程 MBean

使 MBean 成为远程对象的最简单方式是配置 Spring 的 ConnectorServerFactoryBean:

@Bean
public ConnectorServerFactoryBean connectorServerFactoryBean() {
  return new ConnectorServerFactoryBean();
}

ConnectorServerFactoryBean 会创建和启动 JSR-160 JMXConnectorServer。默认情况下,服务器使用 JMXMP 协议并监听端口 9875 —— 因此,它将绑定 “service:jmx:jmxmp://localhost:9875”。但是我们导出 MBean 的可选方案并不局限于 JMXMP。

根据不同 JMX 的实现,我们有多种远程访问协议可供选择,包括远程方法调用(Remote Method Invocation,RMI)、SOAP、Hessian/Burlap 和 IIOP(Internet InterORB Protocol)。为 MBean 绑定不同的远程访问协议,我们仅需要设置 ConnectorServerFactoryBean 的 serviceUrl 属性。例如,如果我们想使用 RMI 远程访问 MBean,我们可以像下面示例这样配置:

@Bean
public ConnectorServerFactoryBean connectorServerFactoryBean() {
  ConnectorServerFactoryBean cafb = new ConnectorServerFactoryBean();
  cafb.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/spitter");
  return cafb;
}

在这里,我们将 ConnectorServerFactoryBean 绑定到了一个 RMI 注册表,该注册表监听本机的 1099 端口。这意味着我们需要一个 RMI 注册表运行时,并监听该端口。我们可以回顾下第 15 章,RmiServiceExporter 可以为我们自动启动一个 RMI 注册表。

但是,我们在本示例中不使用 RmiServiceExporter,而是通过在 Spring 中声明 RmiRegistryFactoryBean 来启动一个 RMI 注册表,如下面的 @Bean 方法所示:

@Bean
public RmiRegistryFactoryBean rmiRegistry() {
  RmiRegistryFactoryBean rmiRegistryFB = new RmiRegistryFactoryBean();
  rmiRegistryFB.setPort(1099);
  return rmiRegistryFB;
}

没错!现在我们的 MBean 可以通过 RMI 进行远程访问了。但是如果没有人通过 RMI 访问 MBean 的话,那就不值得这么做。所以现在让我们把关注点转向 JMX 远程访问的客户端,看看如何在 Spring 中装配一个远程 MBean 到 JMX 客户端中。

Last updated