Netty 3升级至4.1:SimpleChannelUpstreamHandler及messageReceived替代方案咨询
Netty 3.x 到4.1升级:SimpleChannelUpstreamHandler与messageReceived的替代方案
核心替代方案
- SimpleChannelUpstreamHandler的替代类:Netty 4.1中使用
ChannelInboundHandlerAdapter作为替代,它是入站处理器的基础适配器类,承担和原类相同的角色。 - messageReceived方法的替代:对应
channelRead(ChannelHandlerContext ctx, Object msg)方法,这是Netty 4.x中处理接收消息的核心方法,完全替代了3.x版本的messageReceived。
改造后的代码示例
public class IcapClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { IcapResponse response = (IcapResponse) msg; if (response.getStatus().equals(IcapResponseStatus.CONTINUE)) { System.out.println(response.toString()); // Netty 4.x 用Unpooled替代原ChannelBuffers工具类 IcapChunk chunk = new DefaultIcapChunk(Unpooled.copiedBuffer("ns why and how we can avoid such a desaster next time...".getBytes())); IcapChunkTrailer trailer = new DefaultIcapChunkTrailer(true,false); // 写入操作直接通过ctx执行,需调用flush触发发送 ctx.write(chunk); ctx.write(trailer); ctx.flush(); } else if (response.getStatus().equals(IcapResponseStatus.NO_CONTENT)) { System.out.println(response.toString()); } // 若msg是ReferenceCounted类型(如ByteBuf),处理完需释放资源避免内存泄漏 // ReferenceCountUtil.release(msg); } }
关键注意事项
- 缓冲区API变更:Netty 4.x移除了
ChannelBuffers,统一使用Unpooled工具类创建ByteBuf实例。 - 写入与发送分离:
ctx.write()仅将消息写入出站缓冲区,不会立即发送;需调用ctx.flush()或ctx.writeAndFlush(msg)触发实际发送操作。 - 资源管理:对于实现
ReferenceCounted接口的消息对象(如ByteBuf),处理完成后务必调用ReferenceCountUtil.release(msg)释放资源;若需要将消息传递给后续处理器,可调用ctx.fireChannelRead(msg)。
内容的提问来源于stack exchange,提问作者Bharat Bhansali
相关产品推荐
相关产品推荐

