From: Brian S. <bri...@wa...> - 2005-09-02 21:16:44
|
User: bstansberry Date: 05/09/02 17:16:42 Modified: src/org/jboss/cache/rpc RpcTreeCache.java Log: Match HAPartitionImpl by removing any NoHandlerForRPCException from the List returned to the caller. Revision Changes Path 1.2 +40 -16 JBossCache/src/org/jboss/cache/rpc/RpcTreeCache.java (In the diff below, changes in quantity of whitespace are not shown.) Index: RpcTreeCache.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/rpc/RpcTreeCache.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -b -r1.1 -r1.2 --- RpcTreeCache.java 2 Sep 2005 06:30:16 -0000 1.1 +++ RpcTreeCache.java 2 Sep 2005 21:16:42 -0000 1.2 @@ -3,11 +3,13 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import org.jboss.cache.TreeCache; +import org.jgroups.Address; import org.jgroups.JChannel; import org.jgroups.blocks.MethodCall; @@ -108,10 +110,8 @@ * @return List containing the responses that were received, or * <code>null</code> if the call is asynchronous. * Elements of the list will either be a returned value - * or an exception if one was returned. - * - * @throws NoHandlerForRPCException if no handler is registered on this node - * under <code>serviceName</code>. + * or an exception if one was returned. Any + * NoHandlerForRPCException returned will be removed. * * @throws Exception */ @@ -124,7 +124,11 @@ /** * Calls a remote method on nodes in the cluster, targeted at * objects registered under a given <code>serviceName</code>. - * + * <p> + * If the cache's <code>cache mode</code> is <code>TreeCache.LOCAL</code> + * and parameter <code>exclude_self</code> is <code>false</code> + * this request will be made directly to {@link #_dispatchRpcCall()}. + * </p> * * @param serviceName name of a callback handler that will have been * registered on the remote end via @@ -144,10 +148,8 @@ * @return List containing the responses that were received, or * <code>null</code> if the call is asynchronous. * Elements of the list will either be a returned value - * or an exception if one was returned. - * - * @throws NoHandlerForRPCException if no handler is registered on this node - * under <code>serviceName</code>. + * or an exception if one was returned. Any + * NoHandlerForRPCException returned will be removed. * * @throws Exception */ @@ -166,13 +168,17 @@ if (synchronous) { // For synchronous calls we have to return something - responses = new ArrayList(1); + responses = new ArrayList(); + if (exclude_self == false) { - // Make the call locally and add the response to result list + // Make the call locally and add a valid response to result list + Object resp = _dispatchRpcCall(serviceName, method_call); + if ((resp instanceof NoHandlerForRPCException) == false) responses.add(_dispatchRpcCall(serviceName, method_call)); } // else just return an empty list + } else if (exclude_self == false) { @@ -190,7 +196,24 @@ MethodCall wrapper = new MethodCall(dispatchRpcCallMethod, new Object[] { serviceName, method_call}); - responses = callRemoteMethods(mbrs, wrapper, synchronous, exclude_self, timeout); + responses = callRemoteMethods(mbrs, wrapper, synchronous, + exclude_self, timeout); + + // Remove any NoHandlerForRPCException + // Its inefficient doing this here, but if we add it to + // TreeCache.callRemoteMethods we slow down normal cache ops + if (responses != null) + { + for (int i = 0; i < responses.size(); i++) + { + Object obj = responses.get(i); + if (obj instanceof NoHandlerForRPCException) + { + responses.remove(i); + i--; + } + } + } } return responses; @@ -220,7 +243,8 @@ * @return List containing the responses that were received, or * <code>null</code> if the call is asynchronous. * Elements of the list will either be a returned value - * or an exception if one was returned. + * or an exception if one was returned. Any + * NoHandlerForRPCException returned will be removed. * * @throws NoHandlerForRPCException if no handler is registered on this node * under <code>serviceName</code>. @@ -301,7 +325,7 @@ log.trace(msg); - return new NoHandlerForRPCException(msg); + return new NoHandlerForRPCException(msg, (Address) getLocalAddress()); } try |