From e998ee59f637b7e4fceb42e3e700ef6f254b8d0c Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Thu, 13 Dec 2012 18:10:02 -0800 Subject: [PATCH] fix some RPC problem --- .../messaging/AsyncCallbackDispatcher.java | 29 +++++++++++++++---- .../messaging/RpcCallbackDispatcher.java | 25 +++++++++++++--- .../framework/messaging/RpcProviderImpl.java | 2 +- .../messaging/RpcServiceDispatcher.java | 27 +++++++++++++---- .../server/SampleManagerComponent2.java | 1 + 5 files changed, 68 insertions(+), 16 deletions(-) diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java index 958a765156f..089a5d84490 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/AsyncCallbackDispatcher.java @@ -26,7 +26,7 @@ import java.util.Map; @SuppressWarnings("rawtypes") public class AsyncCallbackDispatcher implements AsyncCompletionCallback { - private static Map, Method> s_handlerCache = new HashMap, Method>(); + private static Map, Map> s_handlerCache = new HashMap, Map>(); private Map _contextMap = new HashMap(); private String _operationName; @@ -100,17 +100,20 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { return true; } - public static Method resolveHandler(Class handlerClz, String operationName) { + public static Method resolveHandler(Class handlerClz, String command) { synchronized(s_handlerCache) { - Method handler = s_handlerCache.get(handlerClz); + Map handlerMap = getAndSetHandlerMap(handlerClz); + + Method handler = handlerMap.get(command); if(handler != null) return handler; - for(Method method : handlerClz.getMethods()) { + for(Method method : handlerClz.getDeclaredMethods()) { AsyncCallbackHandler annotation = method.getAnnotation(AsyncCallbackHandler.class); if(annotation != null) { - if(annotation.operationName().equals(operationName)) { - s_handlerCache.put(handlerClz, method); + if(annotation.operationName().equals(command)) { + handlerMap.put(command, method); + method.setAccessible(true); return method; } } @@ -119,4 +122,18 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { return null; } + + private static Map getAndSetHandlerMap(Class handlerClz) { + Map handlerMap; + synchronized(s_handlerCache) { + handlerMap = s_handlerCache.get(handlerClz); + + if(handlerMap == null) { + handlerMap = new HashMap(); + s_handlerCache.put(handlerClz, handlerMap); + } + } + + return handlerMap; + } } diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java index 8fbe38fe1ad..16f68224fbc 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java @@ -25,7 +25,7 @@ import java.util.Map; public class RpcCallbackDispatcher { - private static Map, Method> s_handlerCache = new HashMap, Method>(); + private static Map, Map> s_handlerCache = new HashMap, Map>(); public static boolean dispatch(Object target, RpcClientCall clientCall) { assert(clientCall != null); @@ -50,15 +50,18 @@ public class RpcCallbackDispatcher { public static Method resolveHandler(Class handlerClz, String command) { synchronized(s_handlerCache) { - Method handler = s_handlerCache.get(handlerClz); + Map handlerMap = getAndSetHandlerMap(handlerClz); + + Method handler = handlerMap.get(command); if(handler != null) return handler; - for(Method method : handlerClz.getMethods()) { + for(Method method : handlerClz.getDeclaredMethods()) { RpcCallbackHandler annotation = method.getAnnotation(RpcCallbackHandler.class); if(annotation != null) { if(annotation.command().equals(command)) { - s_handlerCache.put(handlerClz, method); + method.setAccessible(true); + handlerMap.put(command, method); return method; } } @@ -67,4 +70,18 @@ public class RpcCallbackDispatcher { return null; } + + private static Map getAndSetHandlerMap(Class handlerClz) { + Map handlerMap; + synchronized(s_handlerCache) { + handlerMap = s_handlerCache.get(handlerClz); + + if(handlerMap == null) { + handlerMap = new HashMap(); + s_handlerCache.put(handlerClz, handlerMap); + } + } + + return handlerMap; + } } diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java index d8bf8868b1c..9e23a2a05c3 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java @@ -167,7 +167,7 @@ public class RpcProviderImpl implements RpcProvider { } for(RpcServiceEndpoint endpoint : endpoints) { - if(RpcServiceDispatcher.dispatch(endpoint, call)) + if(endpoint.onCallReceive(call)) return; } diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java index 207fb0695a5..84d979a8600 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java @@ -25,7 +25,7 @@ import java.util.Map; public class RpcServiceDispatcher implements RpcServiceEndpoint { - private static Map, Method> s_handlerCache = new HashMap, Method>(); + private static Map, Map> s_handlerCache = new HashMap, Map>(); private static Map s_targetMap = new HashMap(); private Object _targetObject; @@ -75,15 +75,18 @@ public class RpcServiceDispatcher implements RpcServiceEndpoint { public static Method resolveHandler(Class handlerClz, String command) { synchronized(s_handlerCache) { - Method handler = s_handlerCache.get(handlerClz); + Map handlerMap = getAndSetHandlerMap(handlerClz); + + Method handler = handlerMap.get(command); if(handler != null) return handler; - for(Method method : handlerClz.getMethods()) { + for(Method method : handlerClz.getDeclaredMethods()) { RpcServiceHandler annotation = method.getAnnotation(RpcServiceHandler.class); if(annotation != null) { if(annotation.command().equals(command)) { - s_handlerCache.put(handlerClz, method); + method.setAccessible(true); + handlerMap.put(command, method); return method; } } @@ -92,7 +95,21 @@ public class RpcServiceDispatcher implements RpcServiceEndpoint { return null; } - + + private static Map getAndSetHandlerMap(Class handlerClz) { + Map handlerMap; + synchronized(s_handlerCache) { + handlerMap = s_handlerCache.get(handlerClz); + + if(handlerMap == null) { + handlerMap = new HashMap(); + s_handlerCache.put(handlerClz, handlerMap); + } + } + + return handlerMap; + } + @Override public boolean onCallReceive(RpcServerCall call) { return dispatch(_targetObject, call); diff --git a/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java b/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java index 9a439b4ce0c..e2259d3b358 100644 --- a/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java +++ b/framework/ipc/test/org/apache/cloudstack/framework/messaging/server/SampleManagerComponent2.java @@ -61,6 +61,7 @@ public class SampleManagerComponent2 { s_logger.info("StoragePrepare command arg. pool: " + cmd.getStoragePool() + ", vol: " + cmd.getVolumeId()); SampleStoragePrepareAnswer answer = new SampleStoragePrepareAnswer(); + answer.setResult("Successfully executed StoragePrepare command"); call.completeCall(answer); }