使用JBoss MBean服务器注册MBean - 无法找到JBoss MBean服务器

时间:2011-10-27 20:54:51

标签: java spring

我使用Spring公开MBean并将其注册到JBoss MBean服务器。当战争被放入JBoss的一个实例时,这很好。但是在运行单元测试时它不起作用(这是有道理的,因为没有运行JBoss的实例) 以下是弹簧配置的摘录

<bean id="updateConfigMBean" class="mypackage.UpdateConfigMBean"/>

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="server">
    <bean class="org.jboss.mx.util.MBeanServerLocator" factory-method="locateJBoss"/>
</property>
<property name="beans">
<map>
<entry key="mypackage:name=configurationMBean" value-ref="updateConfigMBean"/>
</map>
</property>
</bean>

我正在寻找的是一种处理这个问题的优雅方式(不希望有两个弹簧配置(用于测试和部署),并且禁用弹簧配置验证测试不是一种选择。

谢谢!

2 个答案:

答案 0 :(得分:0)

这是你可能需要有两个配置的情况之一,一个用于测试,一个用于部署。

这是Maven的优点,因为您可以清楚地分离部署配置和测试配置。如果你担心保持两个配置,那么你需要构建你的配置,以便将所有常见位导入到其他配置中(这就是我们如何做到的)。

答案 1 :(得分:0)

我正在使用@Bean来解决这个问题。 @Bean是为特定环境的bean创建而量身定做的。

下面的逻辑基本上是在开发(Tomcat)和测试(JUnit)中,使用MBeanServerFactoryBean。否则使用JBoss MBean Server。

  @Bean
  def mbeanServer: MBeanServer = {
    val server = if (environment == "development" || environment == "test") {
      val factory = new MBeanServerFactoryBean
      factory.setLocateExistingServerIfPossible(true)
      factory.setRegisterWithFactory(true)
      factory.afterPropertiesSet()
      log.info("using default MBeanServer")
      factory.getObject
    } else {
      val clazz = Class.forName("org.jboss.mx.util.MBeanServerLocator")
      val locateJboss = clazz.getMethod("locateJBoss", List.empty[Class[_]].toArray: _*)
      log.info("using JBoss MBeanServer")
      locateJboss.invoke(null, 
           List.empty[java.lang.Object].toArray: _*).asInstanceOf[MBeanServer]
    }
    log.info("mbeanServer: " + server)
    server
  }

在Spring 3.1中,您可以解决此问题,并仍然使用配置文件来使用XML配置。但上面的内容适用于Spring 3.0。