Netty-自定义Handler失效

1、问题描述

服务启动后,客户端断开重连后无法与服务端交互。

@Component
@Slf4j
public class PotatoChannelInitializer extends ChannelInitializer<SocketChannel> {

    //重点
    @Autowired
    private PotatoChannelHandler potatoChannelHandler;

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //入站解码器
        pipeline.addLast(new ProtobufVarint32FrameDecoder());
        pipeline.addLast(new ProtobufDecoder(MsgProto.Msg.getDefaultInstance()));
        //出站编码器
        pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());
        pipeline.addLast(new ProtobufEncoder());
        //自定义处理器
        pipeline.addLast(potatoChannelHandler);
    }
}
@Component
@Slf4j
public class PotatoChannelHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
        MsgProto.Msg msg = (MsgProto.Msg) obj;
        log.info("===收到client消息:" + msg);
        //回复消息
        ctx.writeAndFlush(msg);
    }
}

2、原因和解决办法

原因:由于服务端自定义handler没有共享,导致新连接没有自定义的Handler处理器。

解决方法:使用@ChannelHandler.Sharable注解修饰自定义处理器

@Component
@Slf4j
@ChannelHandler.Sharable
public class PotatoChannelHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
        MsgProto.Msg msg = (MsgProto.Msg) obj;
        log.info("===收到client消息:" + msg);
        //回复消息
        ctx.writeAndFlush(msg);
    }
}
posted @   往事随雨  阅读(260)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示