dain 2004/04/07 11:40:17 Modified: modules/kernel/src/java/org/apache/geronimo/gbean/jmx GBeanMBeanAttribute.java GBeanMBeanReference.java Log: Added tighter exception handling to lifecycle methods. Revision Changes Path 1.11 +2 -2 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanAttribute.java Index: GBeanMBeanAttribute.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanAttribute.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- GBeanMBeanAttribute.java 18 Mar 2004 10:04:50 -0000 1.10 +++ GBeanMBeanAttribute.java 7 Apr 2004 18:40:17 -0000 1.11 @@ -254,7 +254,7 @@ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(gmbean.getClassLoader()); - assert gmbean.getTarget() == null : "online() invoked, however the corresponding GBeanMBean is " + + assert gmbean.getTarget() != null : "online() invoked, however the corresponding GBeanMBean is " + "not fully initialized (perhaps online() has been called directly instead by a Kernel)"; setInvoker.invoke(gmbean.getTarget(), new Object[] { persistentValue}); } catch (InvocationTargetException e) { 1.5 +72 -58 incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanReference.java Index: GBeanMBeanReference.java =================================================================== RCS file: /home/cvs/incubator-geronimo/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBeanReference.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- GBeanMBeanReference.java 10 Mar 2004 09:59:01 -0000 1.4 +++ GBeanMBeanReference.java 7 Apr 2004 18:40:17 -0000 1.5 @@ -26,13 +26,14 @@ import java.util.Set; import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; -import javax.management.ListenerNotFoundException; import javax.management.MBeanServerNotification; import javax.management.Notification; import javax.management.NotificationFilterSupport; import javax.management.NotificationListener; import javax.management.ObjectName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.geronimo.gbean.GReferenceInfo; import org.apache.geronimo.gbean.InvalidConfigurationException; import org.apache.geronimo.gbean.WaitingException; @@ -46,6 +47,8 @@ * @version $Revision$ $Date$ */ public class GBeanMBeanReference implements NotificationListener { + private static final Log log = LogFactory.getLog(GBeanMBeanReference.class); + /** * Name of this reference. */ @@ -149,74 +152,82 @@ } public synchronized void online() throws Exception { - // create the proxy - if (singleValued) { - proxy = new SingleProxy(gmbean, name, type, patterns); - } else { - proxy = new CollectionProxy(gmbean, name, type); - } - - - // listen for all mbean registration events try { - NotificationFilterSupport mbeanServerFilter = new NotificationFilterSupport(); - mbeanServerFilter.enableType(MBeanServerNotification.REGISTRATION_NOTIFICATION); - mbeanServerFilter.enableType(MBeanServerNotification.UNREGISTRATION_NOTIFICATION); - gmbean.getServer().addNotificationListener(JMXUtil.DELEGATE_NAME, this, mbeanServerFilter, null); - } catch (Exception e) { - // this will never happen... all of the above is well formed - throw new AssertionError(e); - } + // create the proxy + if (singleValued) { + proxy = new SingleProxy(gmbean, name, type, patterns); + } else { + proxy = new CollectionProxy(gmbean, name, type); + } - // register for state change notifications with all mbeans that match the target patterns - Set registeredTargets = new HashSet(); - for (Iterator targetIterator = patterns.iterator(); targetIterator.hasNext();) { - ObjectName pattern = (ObjectName) targetIterator.next(); - Set names = gmbean.getServer().queryNames(pattern, null); - for (Iterator objectNameIterator = names.iterator(); objectNameIterator.hasNext();) { - ObjectName target = (ObjectName) objectNameIterator.next(); - if (!registeredTargets.contains(target)) { - try { - gmbean.getServer().addNotificationListener(target, this, NotificationType.STATE_CHANGE_FILTER, null); - } catch (InstanceNotFoundException e) { - // the instance died before we could get going... not a big deal - break; - } - // if the bean is running add it to the runningTargets list - if (isRunning(target)) { - proxy.addTarget(target); + // listen for all mbean registration events + try { + NotificationFilterSupport mbeanServerFilter = new NotificationFilterSupport(); + mbeanServerFilter.enableType(MBeanServerNotification.REGISTRATION_NOTIFICATION); + mbeanServerFilter.enableType(MBeanServerNotification.UNREGISTRATION_NOTIFICATION); + gmbean.getServer().addNotificationListener(JMXUtil.DELEGATE_NAME, this, mbeanServerFilter, null); + } catch (Exception e) { + // this will never happen... all of the above is well formed + throw new AssertionError(e); + } + + // register for state change notifications with all mbeans that match the target patterns + Set registeredTargets = new HashSet(); + for (Iterator targetIterator = patterns.iterator(); targetIterator.hasNext();) { + ObjectName pattern = (ObjectName) targetIterator.next(); + Set names = gmbean.getServer().queryNames(pattern, null); + for (Iterator objectNameIterator = names.iterator(); objectNameIterator.hasNext();) { + ObjectName target = (ObjectName) objectNameIterator.next(); + if (!registeredTargets.contains(target)) { + try { + gmbean.getServer().addNotificationListener(target, this, NotificationType.STATE_CHANGE_FILTER, null); + } catch (InstanceNotFoundException e) { + // the instance died before we could get going... not a big deal + break; + } + + // if the bean is running add it to the runningTargets list + if (isRunning(target)) { + proxy.addTarget(target); + } } } } - } - // set the proxy into the instance - if (setInvoker != null && patterns.size() > 0) { - ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); - try { - Thread.currentThread().setContextClassLoader(gmbean.getClassLoader()); - setInvoker.invoke(gmbean.getTarget(), new Object[]{proxy.getProxy()}); - } finally { - Thread.currentThread().setContextClassLoader(oldClassLoader); + // set the proxy into the instance + if (setInvoker != null && patterns.size() > 0) { + ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(gmbean.getClassLoader()); + setInvoker.invoke(gmbean.getTarget(), new Object[]{proxy.getProxy()}); + } finally { + Thread.currentThread().setContextClassLoader(oldClassLoader); + } } + } catch (Exception e) { + // clean up if we got an exception + offline(); + throw e; + } catch (Error error) { + // clean up if we got an exception + offline(); + throw error; } } public synchronized void offline() { - try { - gmbean.getServer().removeNotificationListener(JMXUtil.DELEGATE_NAME, this); - } catch (InstanceNotFoundException ignore) { - // we don't care... the mbean we were listening to disapeared - } catch (ListenerNotFoundException ignore) { - // we don't care... the mbean doesn't think we were listening - } - if (proxy == null) { //we weren't fully online return; } + try { + gmbean.getServer().removeNotificationListener(JMXUtil.DELEGATE_NAME, this); + } catch (Exception ignore) { + // don't care... we tried + } + // get the targets from the proxy because we are listening to them Set registeredTargets = proxy.getTargets(); @@ -229,15 +240,12 @@ ObjectName target = (ObjectName) iterator.next(); try { gmbean.getServer().removeNotificationListener(target, this, NotificationType.STATE_CHANGE_FILTER, null); - } catch (InstanceNotFoundException ignore) { - // we don't care... the mbean we were listening to disapeared - } catch (ListenerNotFoundException ignore) { - // we don't care... the mbean doesn't think we were listening + } catch (Exception ignore) { + // don't care... we tried } } } - public synchronized void start() throws WaitingException { if (!patterns.isEmpty()) { proxy.start(); @@ -251,6 +259,12 @@ } public synchronized void handleNotification(Notification notification, Object o) { + if(proxy == null) { + // we are not initialized and should not be recieving notifications + log.debug("Offline reference recieved a notification: " + notification); + return; + } + String type = notification.getType(); if (MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(type)) {