开发者

Can't make Spring JMX NotificationListener work

开发者 https://www.devze.com 2023-01-27 03:50 出处:网络
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.

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:schemaL开发者_如何学编程ocation="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?


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)


Have you seen the notifications appear in jConsole or jVisualVM?

Try changing:

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

to:

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

If not for notifications, you could simpify the XML above to:

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

精彩评论

暂无评论...
验证码 换一张
取 消