netty中的消息分发和回调

消息分发

根据消息id做分发,终端主动上报的分发到具体业务实现的handle类处理,下发指令查询的时候,send成功返回一个新建的SettableFuture实例并缓存,消息上报分发的时候将SettableFuture实例移除,并对取出的SettableFuture进行设值

@Override
    public void channelRead(ChannelHandlerContext ctx, Object protoMsg) throws Exception {
        ProtoMsg msg = (ProtoMsg) protoMsg;
        receiveMessage(msg);
    }
   protected void receiveMessage(final ProtoMsg msg) {
        try {
        
            boolean done = false;
            //系统通用应答
            if (msg.msgId == ProtoConstants.TERMINAL_GENERAL_RES) {
                done = doUpGeneralRes(msg);
            } else {
           //业务应答
                if (resMsgIds.contains(msg.msgId)) {
                    done = doUpRes(msg);
                }
            }
            //消息上报
            if (!done) {
                dispatchMessage(msg);
            }
        } catch (Exception e) {
            //sendCenterGeneralRes(msg, ProtoConstants.RC_FAIL);
            logger.warn("处理上行消息失败:msgId=0x" + CodecUtils.shortToHex(msg.msgId));
        }
    }

周期上报

    private void dispatchMessage(ProtoMsg msg) {
        //接口的不同业务实现类
        BaseProtoHandler handler = HandlersManger.getUpHandlers(msg.msgId);
        if (handler == null) {
            logger.warn("TcpChannel未找到消息处理器:msgId=0x" + CodecUtils.shortToHex(msg.msgId));
        } else {
            try {
                logger.info("msg:{},taskId:{}",msg.msgId,config.getTaskId());
                handler.handle(msg, config.getTaskId(), config.getChannelProcessor());
            } catch (Exception e) {
                logger.warn("处理消息失败:msgId=0x" + CodecUtils.shortToHex(msg.msgId));
            }
        }
    }

回调

   ListenableFuture<ProtoMsg> f = sendRequest(req, (short) 0x0001);

推荐阅读更多精彩内容