如何向WebSphere7上的MBean添加NotificationListener。侦听器从未添加到mbean?

如何向WebSphere7上的MBean添加NotificationListener。侦听器从未添加到mbean?,websphere,jmx,Websphere,Jmx,我正在尝试添加NotificationListener以侦听来自已注册MBean的通知 通过我的MBean设置,我可以连接到我的WAS7测试环境,并查看/管理我的“HelloMBean”。此外,我还可以通过com.ibm.websphere.management.AdminClient对其调用方法。我创建了一个测试侦听器类: /** * Inner class that will handle the notifications. */ public static c

我正在尝试添加NotificationListener以侦听来自已注册MBean的通知

通过我的MBean设置,我可以连接到我的WAS7测试环境,并查看/管理我的“HelloMBean”。此外,我还可以通过
com.ibm.websphere.management.AdminClient
对其调用方法。我创建了一个测试侦听器类:

/**
     * Inner class that will handle the notifications.
     */
    public static class ClientListener implements NotificationListener {
        public void handleNotification(Notification notification, Object handback) {
            RasMessage rasMessage = (RasMessage) notification.getUserData();
            System.out.println("Localized message: " + rasMessage.getLocalizedMessage(null));
            System.out.println("\nReceived notification:");
            System.out.println("\tClassName: " + notification.getClass().getName());
            System.out.println("\tSource: " + notification.getSource());
            System.out.println("\tType: " + notification.getType());
            System.out.println("\tMessage: " + notification.getMessage());
            if (notification instanceof AttributeChangeNotification) {
                AttributeChangeNotification acn = (AttributeChangeNotification) notification;
                System.out.println("\tAttributeName: " + acn.getAttributeName());
                System.out.println("\tAttributeType: " + acn.getAttributeType());
                System.out.println("\tNewValue: " + acn.getNewValue());
                System.out.println("\tOldValue: " + acn.getOldValue());
            }
        }

    }
我采取的步骤是:

  • 创建MBean
  • 注册MBean(我可以在控制台上看到它)
  • 然后,使用正确的ObjectName,我尝试添加三个通知侦听器 不同的方式
所有这些都不会在MBean上调用addNotificationListener

ClientListener listener = new ClientListener();
                adminClient.addNotificationListenerExtended(objectName, listener, null, null);
                adminClient.addNotificationListener(objectName, listener, null, null);
                    AdminServiceFactory.getMBeanFactory().getMBeanServer().addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, listener, null, null);
然后在MBean上调用应该发送通知的方法

问题在于,在NotificationBroadcasterSupport.sendNotification()中,此MBean的侦听器列表中没有任何侦听器

我猜在前面的步骤中尝试添加mbean上的“addNotificationListener()”方法时,应该调用它,但它从来没有这样做过

有什么想法吗

我还尝试手动添加它们,但效果不佳:

//接口

public interface HelloMBean extends TUFMBean {

public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback);

public abstract String getName();

public abstract int getCacheSize();

public abstract void setCacheSize(int size);

public abstract void sayHello();

public abstract int add(int x, int y);

public abstract MBeanNotificationInfo[] getNotificationInfo();

public String getIdentification();

public void initialize(Object paramObject);
}

//impl:

   package cat.dcs.core.services.mbean;

import javax.management.AttributeChangeNotification;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;

import junitx.util.PrivateAccessor;

public class HelloNotificationImpl extends NotificationBroadcasterSupport implements HelloMBean {

    private String name = "HelloMBean";
    private int cacheSize = DEFAULT_CACHE_SIZE;
    private static final int DEFAULT_CACHE_SIZE = 200;
    private long sequenceNumber = 1;


    public HelloNotificationImpl() {
        System.out.println(">>>>> CONSTRUCTOR " + this);
    }

    /*
     * *************************************************** 
     * TUFMBeanImpl req's
     * ***************************************************
     */
    public HelloNotificationImpl(String paramString) {
        setIdentification(paramString);
    }

    private void setIdentification(String paramString) {
        name = paramString;
    }

    @Override
    public String getIdentification() {
        System.out.println(">>>>> getIdentification " + this);
        return name;
    }

    @Override
    public void initialize(Object paramObject) {
        System.out.println(">>>>> INIT "+ this);

    }

    @Override
    public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) {
        System.out.println(">>>>> ADD NOTIFICATION LISTENER " + this);
        super.addNotificationListener(listener, filter, handback);

        try {
            System.out.println(PrivateAccessor.getField(this, "listenerList"));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }


    /*
     * *************************************************** 
     * notification broadcaster use
     * ***************************************************
     */

    /**
     * TODO Update method documentation for Hello.setCacheSize Description of the method.
     * 
     * @param size
     * @see cat.cis.junk.x#setCacheSize(int)
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    public synchronized void setCacheSize(int size) {
        System.out.println(">>>>> SET CACHE SIZE ON"+ this);

        int oldSize = cacheSize;
        cacheSize = size;

        System.out.println("Cache size now " + cacheSize);

        Notification n = new AttributeChangeNotification(this, sequenceNumber++, System.currentTimeMillis(),
                "CacheSize changed", "CacheSize", "int", oldSize, cacheSize);

        try {
            System.out.println(">>>LISTENER LIST ON MBEAN: " + PrivateAccessor.getField(this, "listenerList"));

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        sendNotification(n);
    }

    /**
     * TODO Update method documentation for Hello.getNotificationInfo Description of the method.
     * 
     * @return
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    @Override
    public MBeanNotificationInfo[] getNotificationInfo() {
        String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };

        String name = AttributeChangeNotification.class.getName();
        String description = "An attribute of this MBean has changed";
        MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
        return new MBeanNotificationInfo[] { info };
    }

    /*
     * *************************************************** 
     * test methods
     * ***************************************************
     */

    /**
     * TODO Update method documentation for Hello.sayHello Description of the method.
     * 
     * @see cat.cis.junk.x#sayHello()
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    public void sayHello() {
        System.out.println("hello, world : " + this);
    }

    /**
     * TODO Update method documentation for Hello.add Description of the method.
     * 
     * @param x
     * @param y
     * @return
     * @see cat.cis.junk.x#add(int, int)
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    public int add(int x, int y) {
        return x + y;
    }

    /**
     * TODO Update method documentation for Hello.getName Description of the method.
     * 
     * @return
     * @see cat.cis.junk.x#getName()
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    public String getName() {
        return name;
    }

    /**
     * TODO Update method documentation for Hello.getCacheSize Description of the method.
     * 
     * @return
     * @see cat.cis.junk.x#getCacheSize()
     * @since 1.0 Jul 5, 2012 9:40:01 AM DudekTA
     */
    public int getCacheSize() {
        return cacheSize;
    }

}
顺便说一句,这也不起作用:

adminClient.invoke(objectName,"addNotificationListener" ,new Object[]{listener,null, null},new String[]{ "javax.management.NotificationListener","javax.management.NotificationFilter", "java.lang.Object" });
添加XML:

<?xml version="1.0" encoding="UTF-8"?>
调用sendNotification时,没有任何侦听器。

@尼古拉斯: 不确定这是否有区别

org.eclipse.osgi.internal.baseAdapter。DefaultClassLoader@3ae03ae [7/9/12 14:00:48:812 CDT]00000012系统输出O1: [WebSphere:name=TestitRate/TestIt.war/HelloMBean,TUFimpl=cat.dcs.core.services.mbean.HelloNotificationImpl,process=server1,TUFinterface=cat.dcs.core.services.mbean.HelloMBean,TUFtype=APPMBean,platform=dynamicproxy,node=C001460186Node02,version=7.0.0.17,type=HelloMBean,mbeanIdentifier=TestitRate/TestIt.war/HelloMBean,cell=C001460186Node02Cell,spec=1。0] [7/9/12 14:00:48:814 CDT]00000012 SystemOut O>>>>>>正在尝试添加 此mbean上的侦听器如下:[7/9/12 14:00:48:814 CDT]00000012 SystemOut O你好,世界: cat.dcs.core.services.mbean。HelloNotificationImpl@36c436c4 [7/9/12 14:00:48:814 CDT]00000012 SystemOut O>>>>>>我的类加载器是: com.ibm.ws.classloader。CompoundClassLoader@586a586a[战争:测试撕裂/测试战争] 本地类路径: C:\workspace\TestIt\WebContent\WEB-INF\classes;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-beanutils-1.7.0.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-codec-1.4.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-collections-3.2.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-discovery-0.2.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-fileupload-1.2.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-httpclient-3.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-io-1.4.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-lang-2.4.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-logging-1.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-logging-adapters-1.1.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-logging-api-1.1.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\commons-net-1.4.1.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\jgl.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\junit-addons-1.4.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\tuf-common.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\tuf-mbeans.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\tuf-server.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\tuf-WEB.jar;C:\workspace\TestIt\WebContent\WEB-INF\lib\tuf-webservices.jar;C:\workspace\TestIt\WebContent 起源: com.ibm.ws.classloader。CompoundClassLoader@56cb56cb[应用程序:TestiTreal]
委托模式:父级优先

mbean的类加载器和管理客户端在哪里不同? :可能更容易阅读:

如果您发布HelloMBean的代码,将会有所帮助。这里有几点建议:

它是实现还是扩展的

确保调用的方法调用


也有可能(不确定WAS)bean必须在描述可以订阅的通知的WAS中发布。

。。。结果如何

我将RMI连接更改为SOAP连接,并且可以注册侦听器

我不知道为什么RMI连接允许我对MBean进行操作,但不设置侦听器,而我可以通过使用soap连接的adminclient完成所有操作


我没有很好的理由,但我就是这样修复的。

下面是实现。是的,它确实扩展了NotificationBroadcaster支持。您可以看到“setCacheSize”调用sendNotification,但listenerList上没有任何侦听器。正如您所说,似乎没有任何类似于>>>>>>>添加通知侦听器的输出。您是从远程JVM注册侦听器,还是从其他类加载器注册侦听器?AdminClient可能无法完成侦听器注册请求,因为A:侦听器类不可序列化,和/或B:MBean impl的类加载器无法加载侦听器类。这都是相同的jvm。启动时,mbean通过一个隐藏websphere“mbfactory.activateMeban()”的抽象进行注册。我给听众添加了Serilizable,没有任何进展。好的,到达这里。。。。。您是否扫描了所有WAS日志以查看MBeanServer是否排除了任何异常?更糟糕的是,在创建MBean和侦听器的类加载器时,您能打印出它们吗?试图确定这是否是类路径范围问题。仅供参考,所有内容都会显示在控制台上。我删除了抽象并手动注册了mbean,但这不起作用,所以我知道这不是“activateMBean”的过程。另外,我不知道,但是当我调用:
adminClient.invoke(objectName,“addNotificationListener”,新对象[]{listener,null,null},n
<attribute name="name" getMethod="getName" type="java.lang.String"
    proxyInvokeType="unicall" />

<attribute name="cacheSize" getMethod="getCacheSize" type="int"
    setMethod="setCacheSize" proxyInvokeType="unicall" />

<operation name="sayHello" role="operation" type="void"
    targetObjectType="objectReference" impact="ACTION" proxyInvokeType="multicall">
    <signature>
    </signature>
</operation>


<operation name="add" role="operation" type="int"
    targetObjectType="objectReference" impact="ACTION" proxyInvokeType="multicall">
    <signature>
        <parameter name="x" description="x" type="int" />
        <parameter name="y" description="x" type="int" />
    </signature>
</operation>

<operation name="getNotificationInfo" role="operation" type="javax.management.MBeanNotificationInfo[]"
    targetObjectType="objectReference" impact="ACTION" proxyInvokeType="multicall">
    <signature>
    </signature>
</operation>

<operation name="addNotificationListener" role="operation" type="void"
    targetObjectType="objectReference" impact="ACTION" proxyInvokeType="multicall">
    <signature>
    <!-- javax.management.NotificationListener","javax.management.NotificationFilter", "java.lang.Object -->
        <parameter name="listener" description="javax.management.NotificationListener" type="javax.management.NotificationListener" />
        <parameter name="filter" description="javax.management.NotificationFilter" type="javax.management.NotificationFilter" />
        <parameter name="handback" description="java.lang.Object" type="java.lang.Object" />
    </signature>
</operation>
[7/9/12 10:28:08:813 CDT] 00000017 SystemOut     O >>>>> CONSTRUCTOR cat.dcs.core.services.mbean.HelloNotificationImpl@7f4c7f4c
[7/9/12 10:28:08:813 CDT] 00000017 SystemOut     O >>>>> INIT cat.dcs.core.services.mbean.HelloNotificationImpl@7f4c7f4c
[7/9/12 10:28:08:813 CDT] 00000017 SystemOut     O >>>>> getIdentification cat.dcs.core.services.mbean.HelloNotificationImpl@7f4c7f4c
[7/9/12 10:28:08:820 CDT] 00000017 servlet       I com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0242I: [TestItEAR] [/TestIt] [TUFMBeanInitializerServlet]: Initialization successful.
[7/9/12 10:28:08:824 CDT] 00000017 SystemOut     O O1: [WebSphere:name=TestItEAR/TestIt.war/HelloMBean,TUFimpl=cat.dcs.core.services.mbean.HelloNotificationImpl,process=server1,TUFinterface=cat.dcs.core.services.mbean.HelloMBean,TUFtype=APPMBean,platform=dynamicproxy,node=C001460186Node02,version=7.0.0.17,type=HelloMBean,mbeanIdentifier=TestItEAR/TestIt.war/HelloMBean,cell=C001460186Node02Cell,spec=1.0]
[7/9/12 10:28:08:826 CDT] 00000017 SystemOut     O >>>>> TRYING TO ADD LISTENER
[7/9/12 10:28:08:826 CDT] 00000017 SystemOut     O hello, world : cat.dcs.core.services.mbean.HelloNotificationImpl@7f4c7f4c
[7/9/12 10:28:08:827 CDT] 00000017 SystemOut     O >>>> CALLING METHOD WITH NOTIFICATION
[7/9/12 10:28:08:827 CDT] 00000017 SystemOut     O >>>>> SET CACHE SIZE ONcat.dcs.core.services.mbean.HelloNotificationImpl@7f4c7f4c
[7/9/12 10:28:08:827 CDT] 00000017 SystemOut     O Cache size now 999
[7/9/12 10:28:08:829 CDT] 00000017 SystemOut     O >>>LISTENER LIST ON MBEAN: []
[7/9/12 14:00:48:811 CDT] 00000012 SystemOut     O >>>>> AC CLASSLOADER IS: