You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pa...@apache.org on 2011/05/17 00:22:25 UTC
svn commit: r1103929 - in /river/jtsk/trunk/src/net/jini/discovery:
LookupDiscovery.java LookupDiscoveryManager.java LookupLocatorDiscovery.java
Author: pats
Date: Mon May 16 22:22:24 2011
New Revision: 1103929
URL: http://svn.apache.org/viewvc?rev=1103929&view=rev
Log:
RIVER-395
Apply patch to make discovery event delivery handle throws from listener methods.
Modified:
river/jtsk/trunk/src/net/jini/discovery/LookupDiscovery.java
river/jtsk/trunk/src/net/jini/discovery/LookupDiscoveryManager.java
river/jtsk/trunk/src/net/jini/discovery/LookupLocatorDiscovery.java
Modified: river/jtsk/trunk/src/net/jini/discovery/LookupDiscovery.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/net/jini/discovery/LookupDiscovery.java?rev=1103929&r1=1103928&r2=1103929&view=diff
==============================================================================
--- river/jtsk/trunk/src/net/jini/discovery/LookupDiscovery.java (original)
+++ river/jtsk/trunk/src/net/jini/discovery/LookupDiscovery.java Mon May 16 22:22:24 2011
@@ -972,17 +972,22 @@ public class LookupDiscovery implements
}//endif(groups.length)
}//end loop
}//endif(firstListener && isLoggable(Level.FINEST)
- switch(task.eventType) {
- case DISCOVERED:
- l.discovered(e);
- break;
- case DISCARDED:
- l.discarded(e);
- break;
- case CHANGED:
- ((DiscoveryChangeListener)l).changed(e);
- break;
- }//end switch(eventType)
+ try {
+ switch(task.eventType) {
+ case DISCOVERED:
+ l.discovered(e);
+ break;
+ case DISCARDED:
+ l.discarded(e);
+ break;
+ case CHANGED:
+ ((DiscoveryChangeListener)l).changed(e);
+ break;
+ }//end switch(eventType)
+ } catch (Throwable t) {
+ logger.log(Levels.HANDLED, "a discovery listener failed to process a " +
+ (task.eventType == DISCARDED ? "discard" : task.eventType == DISCOVERED ? "discover" : "changed") + " event", t);
+ }
firstListener = false;
}//end loop
return null;
Modified: river/jtsk/trunk/src/net/jini/discovery/LookupDiscoveryManager.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/net/jini/discovery/LookupDiscoveryManager.java?rev=1103929&r1=1103928&r2=1103929&view=diff
==============================================================================
--- river/jtsk/trunk/src/net/jini/discovery/LookupDiscoveryManager.java (original)
+++ river/jtsk/trunk/src/net/jini/discovery/LookupDiscoveryManager.java Mon May 16 22:22:24 2011
@@ -25,6 +25,10 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import java.util.logging.Logger;
+
+import com.sun.jini.logging.Levels;
+
import net.jini.config.Configuration;
import net.jini.config.ConfigurationException;
import net.jini.config.EmptyConfiguration;
@@ -67,8 +71,7 @@ import net.jini.core.lookup.ServiceRegis
* <p>
* </a>
*
- * Currently, there are no loggers directly supported by this implementation
- * of <code>LookupDiscoveryManager</code>. All logging information produced
+ * With one exception, all logging information produced
* when using this utility is controlled by the loggers supported by the
* following utilities:
* <p>
@@ -77,9 +80,32 @@ import net.jini.core.lookup.ServiceRegis
* <li> {@link LookupLocatorDiscovery}
* </ul>
* <p>
- * For information about how to obtain logging information when using this
- * implementation of <code>LookupDiscoveryManager</code>, please refer to
- * the documentation provided with the discovery utilities listed above.
+ * This implementation of <code>LookupDiscoveryManager</code> uses the {@link Logger}
+ * named <code>net.jini.discovery.LookupDiscoveryManager</code> to log information
+ * at the following logging levels: <p>
+ *
+ * <table border="1" cellpadding="5"
+ * summary="Describes the information logged by LookupDiscoveryManager, and
+ * the levels at which that information is logged">
+ *
+ * <caption halign="center" valign="top">
+ * <b><code>net.jini.discovery.LookupDiscoveryManager</code></b>
+ * </caption>
+ *
+ * <tr> <th scope="col"> Level</th>
+ * <th scope="col"> Description</th>
+ * </tr>
+ *
+ * <tr>
+ * <td>{@link java.util.logging.Level#HANDLED HANDLED}</td>
+ * <td>
+ * when this utility asynchronously invokes a {@link net.jini.discovery.DiscoveryListener}
+ * implementation and that listener throws and unchecked exception. If the listener throws
+ * in a synchronous path (namely, via {@link #addDiscoveryListener(DiscoveryListener)}) then
+ * the exception is not trapped and will instead throw back to the caller.
+ * </td>
+ * </tr>
+ * </table>
* <p>
*
* @author Sun Microsystems, Inc.
@@ -93,6 +119,11 @@ public class LookupDiscoveryManager impl
DiscoveryGroupManagement,
DiscoveryLocatorManagement
{
+ /* Name of this component; used in config entry retrieval and the logger.*/
+ private static final String COMPONENT_NAME
+ = "net.jini.discovery.LookupDiscoveryManager";
+ /* Logger used by this utility. */
+ private static final Logger logger = Logger.getLogger(COMPONENT_NAME);
/** Constant that indicates the discovery mechanism is group discovery */
public static final int FROM_GROUP = 1;
/** Constant that indicates the discovery mechanism is locator discovery */
@@ -1192,6 +1223,11 @@ public class LookupDiscoveryManager impl
* to date, and will then be notified as new lookup services are
* discovered or existing lookup services are discarded.
* <p>
+ * The listener methods may throw Error or RuntimeException subclasses.
+ * They will normally be reported only through the log. If the discovered
+ * method throws Throwable T during the initial discovery of existing
+ * services then this method will also throw T.
+ * <p>
* If <code>null</code> is input, this method takes no action. If the
* listener input to this method duplicates (using the <code>equals</code>
* method) another element in the current set of listeners, no action
@@ -1341,6 +1377,15 @@ public class LookupDiscoveryManager impl
return null;
}
+ /**
+ * Notify all listeners for a discovery event. If a listener's method
+ * completes abruptly due to a Throwable, it is logged and processing
+ * continues.
+ * @param groupsMap mapping from the elements of the registrars of this
+ * event to the member groups in which each registrar is
+ * a member.
+ * @param eventType The type of event.
+ */
private void notifyListener(Map groupsMap, int eventType) {
if(groupsMap.isEmpty()) return;
ArrayList notifies;
@@ -1350,10 +1395,24 @@ public class LookupDiscoveryManager impl
Iterator iter = notifies.iterator();
while(iter.hasNext()) {
DiscoveryListener l = (DiscoveryListener)iter.next();
- notifyListener(l, groupsMap, eventType);
+ try {
+ notifyListener(l, groupsMap, eventType);
+ } catch (Throwable t) {
+ logger.log(Levels.HANDLED, "a discovery listener failed to process a " +
+ (eventType == DISCARDED ? "discard" : eventType == DISCOVERED ? "discover" : "changed") + " event", t);
+ }
}
}//end notifyListener
+ /**
+ * Notify a specific listener for a discovery event. If the listener's
+ * method throws a Throwable T, this method will also throw T.
+ * @param l The listener to notify.
+ * @param groupsMap mapping from the elements of the registrars of this
+ * event to the member groups in which each registrar is
+ * a member.
+ * @param eventType The type of the event.
+ */
private void notifyListener(DiscoveryListener l,
Map groupsMap,
int eventType)
Modified: river/jtsk/trunk/src/net/jini/discovery/LookupLocatorDiscovery.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/net/jini/discovery/LookupLocatorDiscovery.java?rev=1103929&r1=1103928&r2=1103929&view=diff
==============================================================================
--- river/jtsk/trunk/src/net/jini/discovery/LookupLocatorDiscovery.java (original)
+++ river/jtsk/trunk/src/net/jini/discovery/LookupLocatorDiscovery.java Mon May 16 22:22:24 2011
@@ -650,11 +650,16 @@ public class LookupLocatorDiscovery impl
}//endif(groups.length)
}//end loop
}//endif(firstListener && isLoggable(Level.FINEST)
- if (task.discard) {
- l.discarded(e);
- } else {
- l.discovered(e);
- }//endif
+ try {
+ if (task.discard) {
+ l.discarded(e);
+ } else {
+ l.discovered(e);
+ }//endif
+ } catch (Throwable t) {
+ logger.log(Levels.HANDLED, "a discovery listener failed to process a " +
+ (task.discard ? "discard" : "discover") + " event", t);
+ }
}//end loop
}//end loop
}//end run