您的位置:首页 > 其它

RPC 的RpcHandler用来处理业务的具体调用

2018-02-25 16:45 78 查看
public class RpcHandler extends SimpleChannelInboundHandler<RpcRequest> {

private static final Logger LOGGER = LoggerFactory
.getLogger(RpcHandler.class);

private final Map<String, Object> handlerMap;

public RpcHandler(Map<String, Object> handlerMap) {
this.handlerMap = handlerMap;
}

/**
* 接收消息,处理消息,返回结果
*/
@Override
public void channelRead0(final ChannelHandlerContext ctx, RpcRequest request)
throws Exception {
RpcResponse response = new RpcResponse();
response.setRequestId(request.getRequestId());
try {
//根据request来处理具体的业务调用
Object result = handle(request);
response.setResult(result);
} catch (Throwable t) {
response.setError(t);
}
//写入 outbundle(即RpcEncoder)进行下一步处理(即编码)后发送到channel中给客户端
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}

/**
* 根据request来处理具体的业务调用
* 调用是通过反射的方式来完成
*
* @param request
* @return
* @throws Throwable
*/
private Object handle(RpcRequest request) throws Throwable {
String className = request.getClassName();

//拿到实现类对象
Object serviceBean = handlerMap.get(className);

//拿到要调用的方法名、参数类型、参数值
String methodName = request.getMethodName();
Class<?>[] parameterTypes = request.getParameterTypes();
Object[] parameters = request.getParameters();

//拿到接口类
Class<?> forName = Class.forName(className);

//调用实现类对象的指定方法并返回结果
Method method = forName.getMethod(methodName, parameterTypes);
return method.invoke(serviceBean, parameters);
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
LOGGER.error("server caught exception", cause);
ctx.close();
}


该类通过netty 编码解码,根据request对象的className来调用mapHandle中的使用RpcServer注解的服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐