Skip to content

Commit 644b783

Browse files
committed
Modify RPC callback style to be in consist with the latest AsyncMethod callback style
1 parent e6ac3fd commit 644b783

6 files changed

Lines changed: 59 additions & 133 deletions

File tree

framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackHandler.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

framework/ipc/src/org/apache/cloudstack/framework/rpc/RpcCallbackDispatcher.java

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,47 @@
2020

2121
import java.lang.reflect.InvocationTargetException;
2222
import java.lang.reflect.Method;
23-
import java.util.HashMap;
24-
import java.util.Map;
2523

24+
import net.sf.cglib.proxy.Enhancer;
25+
import net.sf.cglib.proxy.MethodInterceptor;
26+
import net.sf.cglib.proxy.MethodProxy;
2627

27-
public class RpcCallbackDispatcher {
28-
29-
private static Map<Class<?>, Map<String, Method>> s_handlerCache = new HashMap<Class<?>, Map<String, Method>>();
28+
public class RpcCallbackDispatcher<T> {
29+
private Method _callbackMethod;
30+
private T _targetObject;
31+
32+
private RpcCallbackDispatcher(T target) {
33+
_targetObject = target;
34+
}
35+
36+
@SuppressWarnings("unchecked")
37+
public T getTarget() {
38+
return (T)Enhancer.create(_targetObject.getClass(), new MethodInterceptor() {
39+
@Override
40+
public Object intercept(Object arg0, Method arg1, Object[] arg2,
41+
MethodProxy arg3) throws Throwable {
42+
_callbackMethod = arg1;
43+
return null;
44+
}
45+
});
46+
}
3047

31-
public static boolean dispatch(Object target, RpcClientCall clientCall) {
48+
public RpcCallbackDispatcher<T> setCallback(Object useless) {
49+
return this;
50+
}
51+
52+
public static <P> RpcCallbackDispatcher<P> create(P target) {
53+
return new RpcCallbackDispatcher<P>(target);
54+
}
55+
56+
public boolean dispatch(RpcClientCall clientCall) {
3257
assert(clientCall != null);
33-
assert(target != null);
34-
35-
Method handler = resolveHandler(target.getClass(), clientCall.getCommand());
36-
if(handler == null)
58+
59+
if(_callbackMethod == null)
3760
return false;
3861

3962
try {
40-
handler.invoke(target, clientCall);
63+
_callbackMethod.invoke(_targetObject, clientCall, clientCall.getContext());
4164
} catch (IllegalArgumentException e) {
4265
throw new RpcException("IllegalArgumentException when invoking RPC callback for command: " + clientCall.getCommand());
4366
} catch (IllegalAccessException e) {
@@ -48,41 +71,4 @@ public static boolean dispatch(Object target, RpcClientCall clientCall) {
4871

4972
return true;
5073
}
51-
52-
public static Method resolveHandler(Class<?> handlerClz, String command) {
53-
synchronized(s_handlerCache) {
54-
Map<String, Method> handlerMap = getAndSetHandlerMap(handlerClz);
55-
56-
Method handler = handlerMap.get(command);
57-
if(handler != null)
58-
return handler;
59-
60-
for(Method method : handlerClz.getDeclaredMethods()) {
61-
RpcCallbackHandler annotation = method.getAnnotation(RpcCallbackHandler.class);
62-
if(annotation != null) {
63-
if(annotation.command().equals(command)) {
64-
method.setAccessible(true);
65-
handlerMap.put(command, method);
66-
return method;
67-
}
68-
}
69-
}
70-
}
71-
72-
return null;
73-
}
74-
75-
private static Map<String, Method> getAndSetHandlerMap(Class<?> handlerClz) {
76-
Map<String, Method> handlerMap;
77-
synchronized(s_handlerCache) {
78-
handlerMap = s_handlerCache.get(handlerClz);
79-
80-
if(handlerMap == null) {
81-
handlerMap = new HashMap<String, Method>();
82-
s_handlerCache.put(handlerClz, handlerMap);
83-
}
84-
}
85-
86-
return handlerMap;
87-
}
8874
}

framework/ipc/src/org/apache/cloudstack/framework/rpc/RpcCallbackHandler.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

framework/ipc/src/org/apache/cloudstack/framework/rpc/RpcClientCall.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ public interface RpcClientCall {
2929
RpcClientCall setCommandArg(Object arg);
3030
Object getCommandArg();
3131

32-
RpcClientCall setContextParam(String key, Object param);
33-
<T> T getContextParam(String key);
32+
RpcClientCall setContext(Object param);
33+
<T> T getContext();
3434

3535
<T> RpcClientCall addCallbackListener(RpcCallbackListener<T> listener);
36-
RpcClientCall setCallbackDispatcherTarget(Object target);
36+
RpcClientCall setCallbackDispatcher(RpcCallbackDispatcher dispatcher);
3737

3838
RpcClientCall setOneway();
3939

framework/ipc/src/org/apache/cloudstack/framework/rpc/RpcClientCallImpl.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,20 @@
2323
import java.util.List;
2424
import java.util.Map;
2525

26-
2726
public class RpcClientCallImpl implements RpcClientCall {
2827

2928
private String _command;
3029
private Object _commandArg;
3130

3231
private int _timeoutMilliseconds = DEFAULT_RPC_TIMEOUT;
33-
private Map<String, Object> _contextParams = new HashMap<String, Object>();
32+
private Object _contextObject;
3433
private boolean _oneway = false;
3534

3635
@SuppressWarnings("rawtypes")
3736
private List<RpcCallbackListener> _callbackListeners = new ArrayList<RpcCallbackListener>();
38-
private Object _callbackDispatcherTarget;
37+
38+
@SuppressWarnings("rawtypes")
39+
private RpcCallbackDispatcher _callbackDispatcher;
3940

4041
private RpcProvider _rpcProvider;
4142
private long _startTickInMs;
@@ -81,16 +82,15 @@ public Object getCommandArg() {
8182
}
8283

8384
@Override
84-
public RpcClientCall setContextParam(String key, Object param) {
85-
assert(key != null);
86-
_contextParams.put(key, param);
85+
public RpcClientCall setContext(Object param) {
86+
_contextObject = param;
8787
return this;
8888
}
8989

9090
@SuppressWarnings("unchecked")
9191
@Override
92-
public <T> T getContextParam(String key) {
93-
return (T)_contextParams.get(key);
92+
public <T> T getContext() {
93+
return (T)_contextObject;
9494
}
9595

9696
@Override
@@ -101,11 +101,10 @@ public <T> RpcClientCall addCallbackListener(RpcCallbackListener<T> listener) {
101101
}
102102

103103
@Override
104-
public RpcClientCall setCallbackDispatcherTarget(Object target) {
105-
_callbackDispatcherTarget = target;
104+
public RpcClientCall setCallbackDispatcher(RpcCallbackDispatcher dispatcher) {
105+
_callbackDispatcher = dispatcher;
106106
return this;
107107
}
108-
109108

110109
@Override
111110
public RpcClientCall setOneway() {
@@ -210,8 +209,8 @@ public void complete(String result) {
210209
for(@SuppressWarnings("rawtypes") RpcCallbackListener listener: _callbackListeners)
211210
listener.onSuccess(resultObject);
212211
} else {
213-
if(_callbackDispatcherTarget != null)
214-
RpcCallbackDispatcher.dispatch(_callbackDispatcherTarget, this);
212+
if(_callbackDispatcher != null)
213+
_callbackDispatcher.dispatch(this);
215214
}
216215
}
217216

@@ -228,8 +227,8 @@ public void complete(RpcException e) {
228227
for(@SuppressWarnings("rawtypes") RpcCallbackListener listener: _callbackListeners)
229228
listener.onFailure(e);
230229
} else {
231-
if(_callbackDispatcherTarget != null)
232-
RpcCallbackDispatcher.dispatch(_callbackDispatcherTarget, this);
230+
if(_callbackDispatcher != null)
231+
_callbackDispatcher.dispatch(this);
233232
}
234233
}
235234
}

framework/ipc/test/org/apache/cloudstack/framework/codestyle/ClientOnlyEventDrivenStyle.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.apache.cloudstack.framework.codestyle;
2020

21-
import org.apache.cloudstack.framework.rpc.RpcCallbackHandler;
21+
import org.apache.cloudstack.framework.rpc.RpcCallbackDispatcher;
2222
import org.apache.cloudstack.framework.rpc.RpcClientCall;
2323
import org.apache.cloudstack.framework.rpc.RpcException;
2424
import org.apache.cloudstack.framework.rpc.RpcIOException;
@@ -30,17 +30,16 @@ public class ClientOnlyEventDrivenStyle {
3030

3131
public void AsyncCallRpcService() {
3232
String cmd = new String();
33+
RpcCallbackDispatcher<ClientOnlyEventDrivenStyle> callbackDispatcher = RpcCallbackDispatcher.create(this);
34+
callbackDispatcher.setCallback(callbackDispatcher.getTarget().OnAsyncCallRpcServiceCallback(null, null));
3335
_rpcProvider.newCall("host-2").setCommand("TestCommand").setCommandArg(cmd).setTimeout(10000)
34-
.setCallbackDispatcherTarget(this)
35-
.setContextParam("origCmd", cmd) // save context object for callback handler
36+
.setCallbackDispatcher(callbackDispatcher)
37+
.setContext("Context Object") // save context object for callback handler
3638
.apply();
3739
}
3840

39-
@RpcCallbackHandler(command="TestCommand")
40-
public void OnAsyncCallRpcServiceCallback(RpcClientCall call) {
41+
public Void OnAsyncCallRpcServiceCallback(RpcClientCall call, String context) {
4142
try {
42-
String origCmd = call.getContextParam("origCmd"); // restore calling context at callback handler
43-
4443
String answer = call.get();
4544

4645
} catch(RpcTimeoutException e) {
@@ -49,5 +48,7 @@ public void OnAsyncCallRpcServiceCallback(RpcClientCall call) {
4948

5049
} catch(RpcException e) {
5150
}
51+
52+
return null;
5253
}
5354
}

0 commit comments

Comments
 (0)