Не удается заставить Spring JMX NotificationListener работать - PullRequest
9 голосов
/ 25 ноября 2010

Я настроил ManagedBean, используя аннотацию @ManagedResource, используя Spring. А также сопоставил JMX NotificationListener с этим. Но я вижу, что Слушателя никогда не пинают и не казнят Вот соответствующие файлы конфигурации:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="myMBeanServer"
        class="org.springframework.jmx.support.MBeanServerFactoryBean">
        <!-- indicate to first look for a server -->
        <property name="locateExistingServerIfPossible" value="true" />
    </bean>

    <!-- MBean auto exporter -->
    <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
        lazy-init="false">
        <property name="server" ref="myMBeanServer" />
        <property name="assembler" ref="assembler" />
        <property name="namingStrategy" ref="namingStrategy" />
        <property name="notificationListenerMappings">
            <map>
                <entry key="myMBean"
                    value-ref="myMBeanNotificationListener" />
            </map>
        </property>
    </bean>

    <!-- The assembler -->
    <bean id="assembler"
        class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
        <property name="attributeSource" ref="attributeSourceStrategy" />
    </bean>

    <!-- The naming strategy -->
    <bean id="namingStrategy"
        class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
        <property name="attributeSource" ref="attributeSourceStrategy" />
    </bean>

    <!-- The attributeSource strategy -->
    <bean id="attributeSourceStrategy"
        class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />

    <!-- MyMBean -->
    <bean id="myMBean"
        class="com.sample.MyMBean" />

    <!-- MBean Notification Listener -->
    <bean id="myMBeanNotificationListener"
        class="com.sample.MyMBeanNotificationListener" />
</beans>

Вот как выглядит класс MyMBean:

@ManagedResource(description = "My Mbean", objectName = "com.sample:bean=myMBean")
public class MyMBean {

    private boolean isAvailable = true;

    @ManagedAttribute(description = "isAvailable", defaultValue = "true")
    public void setAvailable(boolean flag) {
        this.isAvailable = flag;
    }
}

И, наконец, вот как выглядит NotificationListener:

public class MyMBeanNotificationListener implements
        NotificationListener {

    @Override
    public void handleNotification(Notification notification, Object handback) {
        System.out.println("In Notification Listener" + notification);
    }

}

Есть идеи, почему NotificationListener не выполняется? Нет никаких исключений, выданных кодом.

У кого-нибудь есть JMX NotificationListener, работающий с Spring?

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Это не выполняется, потому что вы, вероятно, включили отложенную загрузку, просто явно установите для lazy-init значение false для компонентов JMX.

Пример: http://java.dzone.com/articles/exposing-pojo-jmx-mbean-easily?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+javalobby/frontpage+(Javalobby+/+Java+Zone)

0 голосов
/ 07 февраля 2011

Видели ли вы, что уведомления появляются в jConsole или jVisualVM?

Попробуйте изменить:

<entry key="myMBean" value-ref="myMBeanNotificationListener" />

до:

<entry key="com.sample:bean=myMBean" value-ref="myMBeanNotificationListener" />

Если бы не уведомления, вы могли бы упростить приведенный выше XML до:

<context:mbean-export default-domain="myDomain"/>
...