类匹配机制
SimpleChannelInboundHandler
在构造时,会通过泛型获取要处理的消息类型- 在经过解码器处理后,
netty
会根据具体的消息类型,将其传递给能够处理该类型的 handler
工作流程
解码器 ---->消息类型判断 ----> 对应类型的SimpleChannelInboundHandler
实现原理
泛型类型获取
public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter {private final TypeParameterMatcher matcher;protected SimpleChannelInboundHandler() {matcher = TypeParameterMatcher.find(this, SimpleChannelInboundHandler.class, "I");}
}
消息类型匹配
public boolean acceptInboundMessage(Object msg) throws Exception {return matcher.match(msg);
}
消息处理流程
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {boolean release = true;try {if (acceptInboundMessage(msg)) {@SuppressWarnings("unchecked")I imsg = (I) msg;channelRead0(ctx, imsg);} else {release = false;ctx.fireChannelRead(msg);}} finally {if (autoRelease && release) {ReferenceCountUtil.release(msg);}}
}