消息分发
根据消息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);