package github.javaguide.handler; import github.javaguide.remoting.dto.RpcRequest; import github.javaguide.remoting.dto.RpcResponse; import github.javaguide.enumeration.RpcResponseCode; import github.javaguide.exception.RpcException; import github.javaguide.provider.ServiceProvider; import github.javaguide.provider.ServiceProviderImpl; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * RpcRequest 的处理器 * * @author shuang.kou * @createTime 2020年05月13日 09:05:00 */ @Slf4j public class RpcRequestHandler { private static ServiceProvider serviceProvider = new ServiceProviderImpl(); /** * 处理 rpcRequest :调用对应的方法,然后返回方法执行结果 */ public Object handle(RpcRequest rpcRequest) { //通过注册中心获取到目标类(客户端需要调用类) Object service = serviceProvider.getServiceProvider(rpcRequest.getInterfaceName()); return invokeTargetMethod(rpcRequest, service); } /** * 根据 rpcRequest 和 service 对象特定的方法并返回结果 * * @param rpcRequest 客户端请求 * @param service 提供服务的对象 * @return 目标方法执行的结果 */ private Object invokeTargetMethod(RpcRequest rpcRequest, Object service) { Object result; try { Method method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamTypes()); if (null == method) { return RpcResponse.fail(RpcResponseCode.NOT_FOUND_METHOD); } result = method.invoke(service, rpcRequest.getParameters()); log.info("service:[{}] successful invoke method:[{}]", rpcRequest.getInterfaceName(), rpcRequest.getMethodName()); } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) { throw new RpcException(e.getMessage(), e); } return result; } }