Java 在netty4.0最终版本中已删除Channel.id(),如何解决?

Java 在netty4.0最终版本中已删除Channel.id(),如何解决?,java,netty,channel,Java,Netty,Channel,我们更新到netty4.0最终版本,但Channel.id()已被删除 我们需要主动向服务器发送消息到客户端,如何找到合适的通道?我们不直接处理返回到客户机的完成处理程序,但需要将流程传输到另一台服务器,然后返回以发送到客户机 在我们使用Channel.id()之前可以完成,但是Channel.id()已被删除,其他解决方案可以做什么?使用Channel.hashcode()可以吗?Github上提出了一些关于此删除的问题。Norman表示可以使用Channel.hashcode(),但不能保证

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

我们需要主动向服务器发送消息到客户端,如何找到合适的通道?我们不直接处理返回到客户机的完成处理程序,但需要将流程传输到另一台服务器,然后返回以发送到客户机


在我们使用Channel.id()之前可以完成,但是Channel.id()已被删除,其他解决方案可以做什么?使用Channel.hashcode()可以吗?

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

另一个想法是创建一个定制的ChannelGroup,但这会带来它自己的复杂性,这里简要讨论:


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

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;
    }

}
将自定义类设置为引导:

EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap clientFactory = new Bootstrap();
clientFactory.group(workerGroup);
clientFactory.channel(SimpleChannel.class);
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
b.channel(SimpleServerChannel.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;
    }

}

是 啊那是第11个小时令人讨厌的惊喜!感兴趣地关注这个问题……它在4.1中回来了:Trustin在4.1.0中带来了通道id的一个变体: