类匹配机制
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);
}
}
}