我正在尝试使用netty 4.x实现异步redis客户端。阅读了netty的源代码和文档后,使用与我在ServerBootstrap中用作childEventLoop的NioEventLoop [s]似乎更有效。问题是好像我需要在每个RedisClientPool上附加这样的NioChildEventLoop,否则我不能共享那些缓存的连接,但是EventLoop不是AttributeMap
我尝试扩展NioEventLoop并覆盖newChild以返回带有NioChildEventLoop字段的自定义AttributeMap(只是复制了代码,因为它被声明为final),因此我可以通过它共享一些对象。

public class NioChildEventLoopWithAttributeMap extends SingleThreadEventLoop {

    private AttributeMap map = new DefaultAttributeMap();

    public <T> Attribute<T> attr(AttributeKey<T> key) {
        return map.attr(key);
    }

    //.... omit the copied codes
}




public class CustomNioEventLoop extends NioEventLoop {
    public EventExecutor newChild() {
        return new NioChildEventLoopWithAttributeMap();
    }
}


但是在AbstractChannel中它会检查EventLoop

protected boolean isCompatible(EventLoop loop) {
    return loop instanceof NioChildEventLoop;
}


我不知道该怎么办,有什么建议吗?对不起,我的英语不好。

最佳答案

仅作记录,github上有一个用于netty4和netty3的redis编解码器:

https://github.com/spullara/redis-protocol

09-11 18:03