}
@Override
public void onReceive(Object message) {
if (message instanceof TypedRequest) {
final TypedRequest req = (TypedRequest) message;
try {
if (req.getMethod().getReturnType().equals(Future.class)) {
try {
Future future = (Future) req.getMethod().invoke(this, req.getArgs());
if (future instanceof ResultFuture) {
req.getFuture().doComplete(future.get());
} else if (future instanceof TypedFuture) {
future.addListener(new FutureCallback() {
@Override
public void onResult(Object result) {
req.getFuture().doComplete(result);
}
@Override
public void onError(Throwable throwable) {
req.getFuture().doError(throwable);
}
});
} else {
// Unsupported
}
} catch (Throwable t) {
t.printStackTrace();
req.getFuture().doError(t);
}
} else {
req.getMethod().invoke(this, req.getArgs());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();