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注解的服务
相关文章推荐
- signal signal函数每次设置具体的信号处理函数(非SIG_IGN)只能生效一次,多次调用需要调用时在加类似监听的方法!!! 最好用sigaction
- Async.js用来处理异步的调用
- php中,控制器如何调用模型来处理业务逻辑?
- struts2:多业务方法的处理(动态调用,DMI)
- 业务中场景中,调用多个service,事务处理中要注意的问题
- 远程调用rpc的时候 远程的异常如何处理
- javascript要不要用来处理业务逻辑
- Java:调用构造器的具体处理步骤
- BaseDao加强版,可连接sqlserver和mysql,使用时直接在main类调用即可,需在src目录下创建一个properties后缀的文件夹,用来存放数据库名称和地址,具体如下
- 转 业务层中 被调用服务的遭遇事务回滚的处理 2方法
- VBA处理文件框架代码 【第五部分(5.1.1):具体业务处理代码】
- uucico命令_Linux uucico 命令用法详解:Linux uucico命令UUCP文件传输服务程序。 uucico是用来处理uucp或uux送到队列的文件传输工具。uucico有两种工作模式:主动模式和附属模式。当在主动模式下时,uucico会调用远端主机;在附属模式下时,uucico则接受远端主机的调用。
- Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
- RPC之Jersey服务调用处理(一)
- 我是这样学习Linux下C语言编程的-RPC远程调用编程
- 系统调用处理程序 系统调用服务例程 关系 区别
- 批量维护业务委托提示该记录已经不存在处理办法
- iOS图片处理(一)————调用系统相机和相册获取图片,给相机添加自定义覆盖物
- 在业务系统中调用Jbpm的过程
- spring mvc 处理分库后,判断访问具体哪一个库的问题