我是靠谱客的博主 激昂裙子,最近开发中收集的这篇文章主要介绍Netty 源码分析之SimpleChannelInboundHandler,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

欢迎关注技术公众号
<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"/>

 

 

 

最后

以上就是激昂裙子为你收集整理的Netty 源码分析之SimpleChannelInboundHandler的全部内容,希望文章能够帮你解决Netty 源码分析之SimpleChannelInboundHandler所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部