Автоматически отменять регистрацию MBeans (зарегистрированную Spring), когда приложение WebLogic не развернуто

В моем приложении Spring (которое развернуто на сервере WebLogic) у меня есть следующие определения bean-компонентов Spring:

<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 для этого?

3 ответа

Решение

Добавьте следующее свойство:

<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>

В настоящее время принятый ответ теперь ссылается на код, который с тех пор устарел. Небольшое изменение необходимо для соответствия обновлению (Spring 3.2 и выше).

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

Свойство registrationPolicy заменяет "registrationBehaviorName" в предоставленном ответе.

Использование REGISTRATION_REPLACE_EXISTING может решить вашу проблему, т. Е. Позволяет перезапустить приложение, но не отвечает на вопрос, который вы задали - "Как я могу автоматически отменить регистрацию MBean во время удаления приложения?".

MBeanExporter реализует DisposableBean, поэтому, когда ApplicationContext закрыт, что должно происходить, когда приложение не развернуто, вызывается его метод destroy, который отменяет регистрацию bean-компонентов и слушателей, которые он ранее зарегистрировал.

Существуют различные биты регистрации, которые будут выводить любые проблемы, возникающие при отмене регистрации.

Вы должны проверить, что ApplicationContext действительно закрыт, потому что это триггер.

Другие вопросы по тегам