NioServerSocketChannel.doReadMessages()创建一个忽略用户定义的ChannelOptions的NioSocketChannel实例。
ServerBootstrap 和 Bootstrap 类通过调用 AbstractBootstrap.initAndRegister()方法创建通道。 像 Bootstrap.connect()和 ServerBootstrap.bind()这样的方法调用方法 AbstractBootstrap.initAndRegister() - AbstractBootstrap.init()最终设置用户定义的通道配置选项,例如自定义ALLOCATOR。
虽然客户端通道( Bootstrap.connect())和服务器侦听通道( ServerBootstrap.bind())会发生这种情况,但是当服务器接受连接方法< strong> NioServerSocketChannel.doReadMessages()被触发,此方法只创建一个新的 NioSocketChannel 而不对其频道配置进行任何更改。因此,此新频道的选项将始终默认,并且所有用户设置都将被完全忽略。
这使得无法设置自定义缓冲区分配器,因为尽管 NioServerSocketChannel 本身将具有 ServerBootstrap.initAndRegister()设置的正确分配器< / em>,将使用有故障的 NioServerSocketChannel.doReadMessages()方法创建服务器上的通道,并始终附加默认分配器。 这适用于任何其他 ChannelOption 。无论用户设置什么,这些频道的整个选项配置始终是默认的。
答案 0 :(得分:0)
非常感谢Ferrybig!
问题恰恰在于,要为ServerBootstrap设置自定义分配器,需要以下内容:
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.option(ChannelOption.ALLOCATOR, alloc)
.childOption(ChannelOption.ALLOCATOR, alloc);