Pooled ByteBuf前面已经提到Netty引入了pooledByteBufinstances。这在很多方面都很实用,举列 如下:
public interface ByteBufAllocator {要想从一个handler那里获取当前的 ByteBufAllocator,可以使用ChannelHandlerContext.alloc()或Channel.alloc()方法: Channel channel = ...; 一旦一个ByteBuf被写入远程节点,它会再次自动的释放进入释放到池(the pool)里。 默认的ByteBufAllocator为PooledByteBufAllocator.如果你不希望使用buffer pooling或使用你自己的allocator,你可以运用Channel.config ().setAllocator(..),以及一个可供选择的 allocator,比如UnpooledByteBufAllocator。 |
事件对象从ChannelHandler中消失了在3.x时代,所有的I/O操作都会创建一个新的 4.0通过把事件对象替换为直接与类型相对应(译者注:原文为strongly typed,但是我觉得直译为强类型不太容易理解)的方法调用,几乎完全避免了事件对象的创建。3.x中,有类似于 handleUpstream()和handleDownstream()这种能够捕获所有相关类型事件的处理器方法,4.0中你将不会再看到它们的身影了。所有的事件类型现在都有各自对应的处理器方法: ChannelHandlerContext类也被修改来反映上述提到的变化:
// Before: 所有这些变化意味着用户无法去扩展ChannelEvent这个已经不存在的接口了。那用户要怎样才能定义他或她自己的事件类型呢,就像IdleStateEvent?4.0中的ChannelHandler有一个处理器方法叫做 userEventTriggered(),它就是被设计用来满足这种特殊的用户需求。 |
Simplified channel state model在3.x中,当一个新的Channel被创建并连接成功,至少三个ChannelStateEvent会被触发:channelOpen、channelBound以及channelConnected。当一个Channel关闭,则对应channelDisconnected 、channelUnbound以及channelClosed三个事件。 fixme 但是,触发这么多事件的意义并不那么明显。如果在一个Channel进入可读或可写的状态时通知用户,想来会更有帮助。 fixme channelOpen、channelBound和channelConnected被合并为channelActive。channelDisconnected、channelUnbound和 channelClosed被合并为channelInactive。类似的,Channel.isBound()和Channel.isConnected()也被合并为了 Channel.isActive()。 需要注意的是,channelRegistered和channelUnregistered这两个事件与channelOpen和channelClosed具有的意义是不一样的。它们 (channelRegistered和channelUnregistered)是在支持Channel的动态注册、注销以及再注册时被引入的,就像下图所示: fixme |