2011-03-24 51 views
3

在我的Spring应用程序(这是部署在WebLogic服务器上),我有以下的Spring bean定义:自动注销的MBean(被Spring注册),当WebLogic应用被卸载

<context:mbean-server /> 

<bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"> 
    <property name="beans"> 
     <map> 
      <entry key="SpringBeans:name=hibernateStatisticsMBean,subsystem=${subsystem}" value-ref="hibernateStatisticsMBean" />       
     </map> 
    </property> 
</bean> 

<bean name="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

它注册新的MBean时应用被部署并完美运作。但是,当我取消部署应用程序并再次部署它时,它会抱怨MBean已经存在。

如何在应用程序取消部署期间自动取消注册MBean?可以通过Spring来完成吗?还是我需要为此做一些WebLogic魔术?

+0

Hows是创建的上下文 - 使用ContextLoaderListener?这可能是因为上下文没有关闭 - 这会导致其他问题。 – gkamal 2011-03-24 16:12:06

回答

5

添加以下属性:

<property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/> 

让你的MBeanExporter的样子:

<bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"> 
    <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/> 
    <property name="beans"> 
     <map> 
      <entry key="SpringBeans:name=hibernateStatisticsMBean,subsystem=${subsystem}" value-ref="hibernateStatisticsMBean" />       
     </map> 
    </property> 
</bean> 
2

使用REGISTRATION_REPLACE_EXISTING可以解决你的问题,即它可以让应用程序重新启动,但它并没有解决您问的问题 - “在卸载应用程序时,我如何自动取消注册MBean?”。

MBeanExporter实现了DisposableBean,所以当ApplicationContext关闭时,当应用程序被取消部署时应该发生这种情况,它的destroy方法被调用,它取消注册之前注册的bean和侦听器。

有各种各样的日志记录,可以输出在注销过程中发生的任何问题。

您应该检查ApplicationContext实际上是否被关闭,因为那是触发器。

1

目前接受的答案现在引用的代码已被弃用。遵守更新(Spring 3.2及更高版本)需要做一些小改动。

<property name="registrationPolicy"> 
    <util:constant static-field="org.springframework.jmx.support.RegistrationPolicy.REPLACE_EXISTING" /> 
</property> 

“registrationPolicy”属性将在所提供的答案中替换“registrationBehaviorName”。

+0

你可以简化为:,因为Spring确实可以识别枚举名 – berhauz 2017-06-27 21:32:04