/* * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ import javax.management.MBeanServer; import javax.management.MBeanServerConnection; import javax.management.MBeanServerFactory; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.event.*; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; /** * */ public class PublishTest { private static MBeanServer mbeanServer; private static EventManager eventManager; private static ObjectName emitter; private static JMXServiceURL url; private static JMXConnectorServer server; private static JMXConnector conn; private static MBeanServerConnection client; /** * @param args the command line arguments */ public static void main(String[] args) throws Exception { System.out.println(">>> PublishTest-main basic tests ..."); mbeanServer = MBeanServerFactory.createMBeanServer(); // for 1.5 if (System.getProperty("java.version").startsWith("1.5") && !mbeanServer.isRegistered(EventClientDelegateMBean.OBJECT_NAME)) { System.out.print("Working on "+System.getProperty("java.version")+ " register "+EventClientDelegateMBean.OBJECT_NAME); mbeanServer.registerMBean(EventClientDelegate. getEventClientDelegate(mbeanServer), EventClientDelegateMBean.OBJECT_NAME); } eventManager = EventManager.getEventManager(mbeanServer); emitter = new ObjectName("Default:name=NotificationEmitter"); url = new JMXServiceURL("rmi", null, 0) ; server = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer); server.start(); url = server.getAddress(); conn = JMXConnectorFactory.connect(url, null); client = conn.getMBeanServerConnection(); boolean succeed; System.out.println(">>> PublishTest-main: using the fetching EventRelay..."); succeed = test(new EventClient(client)); System.out.println(">>> PublishTest-main: using the pushing EventRelay..."); succeed &= test(new EventClient(client, new RMIPushEventRelay(EventClientDelegate.getProxy(client)), null, EventClient.DEFAULT_LEASE_TIMEOUT)); conn.close(); server.stop(); if (succeed) { System.out.println(">>> PublishTest-main: PASSE!"); } else { System.out.println("\n>>> PublishTest-main: FAILED!"); System.exit(1); } } public static boolean test(EventClient efClient) throws Exception { // add listener from the client side Listener listener = new Listener(); efClient.subscribe(emitter, listener, null, null); ObjectName other = new ObjectName("Default:name=other"); // publish notifs for (int i=0; i>> EventManagerService-NotificationEmitter-sendNotifications: "+i); eventManager.publish(emitter, notif); eventManager.publish(other, notif2); // should not received } // waiting long toWait = 6000; long stopTime = System.currentTimeMillis() + toWait; synchronized(listener) { while(listener.received < sendNB && toWait > 0) { listener.wait(toWait); toWait = stopTime - System.currentTimeMillis(); } } // clean efClient.unsubscribe(emitter, listener); efClient.close(); if (listener.received != sendNB) { System.out.println(">>> PublishTest-test: FAILED! Expected to receive "+sendNB+", but got "+listener.received); return false; } else if (listener.seqErr > 0) { System.out.println(">>> PublishTest-test: FAILED! The receiving sequence is not correct."); return false; } else { System.out.println(">>> PublishTest-test: got all expected "+listener.received); return true; } } private static class Listener implements NotificationListener { public int received = 0; public int seqErr = 0; private long lastSeq = -1; public void handleNotification(Notification notif, Object handback) { if (!myType.equals(notif.getType())) { System.out.println(">>> PublishTest-Listener: got unexpected notif: "+notif); System.exit(1); } else if (!emitter.equals(notif.getSource())) { System.out.println(">>> PublishTest-Listener: unknown ObjectName: "+notif.getSource()); System.exit(1); } if (lastSeq == -1) { lastSeq = notif.getSequenceNumber(); } else if (notif.getSequenceNumber() - lastSeq++ != 1) { seqErr++; } System.out.println(">>> PublishTest-Listener: got notif "+notif.getSequenceNumber()); synchronized(this) { if (++received >= sendNB) { this.notify(); } } System.out.println(">>> PublishTest-Listener: received = "+received); } } private static int sendNB = 20; private static long count = 0; private static final String myType = "notification.my_notification"; }