在netty4.0最终版中channel.id()已经被去掉了,请问如何解决?

Posted

技术标签:

【中文标题】在netty4.0最终版中channel.id()已经被去掉了,请问如何解决?【英文标题】:Channel.id () has been removed in netty4.0 final version, how can I solve? 【发布时间】:2013-07-15 10:24:47 【问题描述】:

我们更新到netty4.0最终版本,但是Channel.id()已经被删除了。

我们需要服务器主动向客户端发送消息,如何找到合适的Channel?我们不直接处理返回给客户端的完成处理程序,而是需要将处理过程转移到另一个服务器,然后返回发送给客户端。

之前我们用Channel.id()可以做到,但是Channel.id()已经去掉了,有什么替代方案吗?用channel.hashcode()可以吗?

【问题讨论】:

是的....这是第 11 小时令人讨厌的惊喜!感兴趣地关注这个问题.... 它在 4.1 中回归:github.com/netty/netty/issues/1810 【参考方案1】:

Github 上出现了一些关于此删除的问题。 Norman 表示您可以使用 Channel.hashcode() 但不能保证它是唯一的:

https://github.com/netty/netty/pull/1540

另一个想法是创建一个自定义 ChannelGroup,但这会带来其自身的复杂性,这里简要讨论一下:

https://github.com/netty/netty/issues/1589

【讨论】:

Trustin 在 4.1.0 中恢复了频道 ID 的变体:github.com/netty/netty/issues/1810【参考方案2】:

我做了一个简单的计数器:

public class SimpleChannel extends NiosocketChannel 
    protected static final AtomicLong nextId = new AtomicLong(0);

    protected long id = nextId.getAndIncrement();

    public SimpleChannel() 
    

    public SimpleChannel(SocketChannel socket) 
        super(socket);
    

    public SimpleChannel(Channel parent, Integer id, SocketChannel socket) 
        super(parent, id, socket);
    

    public long getId() 
        return id;
    


将自定义类设置为 Bootstrap:

EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap clientFactory = new Bootstrap();
clientFactory.group(workerGroup);
clientFactory.channel(SimpleChannel.class);

对于服务器来说有点困难:

public class SimpleServerChannel extends NioServerSocketChannel 
    private static final InternalLogger log = InternalLoggerFactory.getInstance(HttpServerChannel.class);

    @Override
    protected int doReadMessages(List<Object> buf) throws Exception 
        SocketChannel ch = javaChannel().accept();

        try 
            if (ch != null) 
                buf.add(new SimpleChannel(this, ch));
                return 1;
            
         catch (Throwable t) 
            log.warn("Failed to create a new channel from an accepted socket.", t);

            try 
                ch.close();
             catch (Throwable t2) 
                log.warn("Failed to close a socket.", t2);
            
        

        return 0;
    


将自定义类设置为 ServerBootstrap:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
b.channel(SimpleServerChannel.class);

【讨论】:

以上是关于在netty4.0最终版中channel.id()已经被去掉了,请问如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Netty4.0学习笔记系列之四:混合使用coder和handler

channel.id() 是啥意思?

Discord.js TypeError:无法读取未定义的属性“id”-channel.id

Discord.js TypeError:无法读取未定义的属性'id'-channel.id

Netty 4.0 ChannelInboundByteHandler 和 ChannelInboundMessageHandler 的区别

client.get_channel(id) 在存在的频道上返回“none”