Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't make Spring JMX NotificationListener work

I have configured a ManagedBean using @ManagedResource annotation using Spring. And also mapped a JMX NotificationListener to this. But I am seeing that the Listener never gets kicked-off/executed.

Here are the related configuration files:

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

Here is how the MyMBean class looks like:

@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;
    }
}

And finally, here's how the NotificationListener looks like:

public class MyMBeanNotificationListener implements
        NotificationListener {

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

}

Any idea why the NotificationListener is not getting executed? There isn't any exception thrown by the code.

Has anyone got the JMX NotificationListeners working with Spring?

like image 424
peakit Avatar asked Nov 25 '10 16:11

peakit


1 Answers

It's not getting executed because you probabily have lazy-load enabled, just set explicitly set lazy-init to false on JMX beans.

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

like image 81
Felipe Oliveira Avatar answered Sep 21 '22 15:09

Felipe Oliveira