Netty 源码分析之SimpleChannelInboundHandler

5 篇文章 0 订阅

 

欢迎关注技术公众号
<img width=300px height=300px src="https://img-blog.csdn.net/20180712233236605?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2lsb3ZlZ291/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70"/>

SimpleChannelInboundHandler继承于ChannelHandlerAdapter,通过加入泛型可以使我们拦截特定类型的对象来进行处理,例如我们解码后得到的ThriftMessage对象,需要注意的是如果没有在构造器中明确指定,SimpleChannelInboundHandler会自动release对象

 

 

public abstract class SimpleChannelInboundHandler<I> extends ChannelHandlerAdapter {

	//类型匹配器
    private final TypeParameterMatcher matcher;
	// 是否自动释放,refCount减一
    private final boolean autoRelease;

    /**
     * @see {@link #SimpleChannelInboundHandler(boolean)} with {@code true} as boolean parameter.
     */
    protected SimpleChannelInboundHandler() {
        this(true);
    }

    /**
     * Create a new instance which will try to detect the types to match out of the type parameter of the class.
     *
     * @param autoRelease   {@code true} if handled messages should be released automatically by pass them to
     *                      {@link ReferenceCountUtil#release(Object)}.
     */
    protected SimpleChannelInboundHandler(boolean autoRelease) {
	    // 根据传入的泛型来确定类型拦截器
        matcher = TypeParameterMatcher.find(this, SimpleChannelInboundHandler.class, "I");
        this.autoRelease = autoRelease;
    }

    /**
     * @see {@link #SimpleChannelInboundHandler(Class, boolean)} with {@code true} as boolean value.
     */
    protected SimpleChannelInboundHandler(Class<? extends I> inboundMessageType) {
	    // 默认释放
        this(inboundMessageType, true);
    }

    /**
     * Create a new instance
     *
     * @param inboundMessageType    The type of messages to match
     * @param autoRelease           {@code true} if handled messages should be released automatically by pass them to
     *                              {@link ReferenceCountUtil#release(Object)}.
     */
    protected SimpleChannelInboundHandler(Class<? extends I> inboundMessageType, boolean autoRelease) {
        matcher = TypeParameterMatcher.get(inboundMessageType);
        this.autoRelease = autoRelease;
    }

    /**
     * Returns {@code true} if the given message should be handled. If {@code false} it will be passed to the next
     * {@link ChannelHandler} in the {@link ChannelPipeline}.
     */
    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)) {
	            // 判断如果是所需要的类型则进行类型转换,调用messageReceive(ctx, imsg)方法进行处理
                @SuppressWarnings("unchecked")
                I imsg = (I) msg;
                messageReceived(ctx, imsg);
            } else {
	            //  如果不是,则不处理,传入ChannelPipeline下一个Handler
                release = false;
                ctx.fireChannelRead(msg);
            }
        } finally {
	        // 如果需要释放则将msg的refCount减一
            if (autoRelease && release) {
                ReferenceCountUtil.release(msg);
            }
        }
    }

    /**
     * Is called for each message of type {@link I}.
     *
     * @param ctx           the {@link ChannelHandlerContext} which this {@link SimpleChannelInboundHandler}
     *                      belongs to
     * @param msg           the message to handle
     * @throws Exception    is thrown if an error occurred
     */
    // 需要用户来实现的实际处理
    protected abstract void messageReceived(ChannelHandlerContext ctx, I msg) throws Exception;
}

 

欢迎关注技术公众号
<img width=300px height=300px src="https://img-blog.csdn.net/20180712233236605?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2lsb3ZlZ291/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70"/>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高级Java进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值