package io.craft.atom.rpc;
import io.craft.atom.protocol.rpc.model.RpcMessage;
import io.craft.atom.rpc.spi.RpcInvoker;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author mindwind
* @version 1.0, Aug 20, 2014
*/
public class RpcInvocationHandler implements InvocationHandler {
private static final Logger LOG = LoggerFactory.getLogger(RpcInvocationHandler.class);
@Getter @Setter private RpcInvoker invoker;
public RpcInvocationHandler(RpcInvoker invoker) {
this.invoker = invoker;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Class<?> rpcInterface = method.getDeclaringClass();
String methodName = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
Object[] parameters = args;
RpcMessage req = RpcMessages.newRequestRpcMessage(rpcInterface, methodName, parameterTypes, parameters);
LOG.debug("[CRAFT-ATOM-RPC] Rpc client proxy before invocation, |req={}|", req);
RpcMessage rsp = invoker.invoke(req);
LOG.debug("[CRAFT-ATOM-RPC] Rpc client proxy after invocation, |rsp={}|", rsp);
return RpcMessages.unpackResponseMessage(rsp);
}
}