public class NetComClientProxy implements FactoryBean<Object> { private static final Logger logger = LoggerFactory.getLogger(NetComClientProxy. class ); private Class<?> iface; private String serverAddress; private String accessToken; private JettyClient client = new JettyClient(); public NetComClientProxy(Class<?> iface, String serverAddress, String accessToken) { this .iface = iface; this .serverAddress = serverAddress; this .accessToken = accessToken; } @Override public Object getObject() throws Exception { return Proxy.newProxyInstance(Thread.currentThread() .getContextClassLoader(), new Class[] { iface }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // filter method like "Object.toString()" if (Object. class .getName().equals(method.getDeclaringClass().getName())) { logger.error( ">>>>>>>>>>> xxl-rpc proxy class-method not support [{}.{}]" , method.getDeclaringClass().getName(), method.getName()); throw new RuntimeException( "xxl-rpc proxy class-method not support" ); } //生成这个代理对象的invoke方法里面,并没有调用目标类的方法,而是将目标的信息发送给远程服务器。 RpcRequest request = new RpcRequest(); request.setServerAddress(serverAddress); // 服务器地址 request.setCreateMillisTime(System.currentTimeMillis()); // 创建时间, 用于判断请求是否超时 request.setAccessToken(accessToken); // 数据校验 request.setClassName(method.getDeclaringClass().getName()); // 将目标类的class名称传给执行器,让那边来创建对象,并执行逻辑代码 request.setMethodName(method.getName()); // 方法名称为run request.setParameterTypes(method.getParameterTypes()); // 参数类型 request.setParameters(args); // 参数 RpcResponse response = client.send(request); // 发送HTTP请求 // valid response if (response == null ) { logger.error( ">>>>>>>>>>> xxl-rpc netty response not found." ); throw new Exception( ">>>>>>>>>>> xxl-rpc netty response not found." ); } if (response.isError()) { throw new RuntimeException(response.getError()); } else { return response.getResult(); } } }); } @Override public Class<?> getObjectType() { return iface; } @Override public boolean isSingleton() { return false ; } } |