springboot集成netty部署在weblogic上停止再启动时端口占用

新手上路,请多包涵

最近手头上出现了一个问题,将springboot集成netty编写的项目打成war包部署在weblogic11g上时,使用weblogic启动一次项目再关闭项目,再次启动的时候netty就发生了端口占用问题,经检查发现是weblogic关闭项目的时候netty并没有关闭,使得项目再次启动初始化netty的时候报错,请问有什么好的解决办法吗?

@Component
//@DependsOn("fieldChangeListener")
public class NettyInital implements ApplicationListener<ContextRefreshedEvent>{
    
    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
    
    @Autowired
    private MessageController messageControllerImpl;
     
    public void start() {
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(parentGroup, childGroup);
            //指定通道排队数量
            bootstrap.option(ChannelOption.SO_BACKLOG, 128)
            //心跳包,设置成false,自己写心跳包
                     .childOption(ChannelOption.SO_KEEPALIVE, false)
                     .channel(NioServerSocketChannel.class)
                     .childHandler(new ChannelInitializer<SocketChannel>() {
                         @Override
                         public void initChannel(SocketChannel ch) throws Exception {
                             logger.info("has a request....");
                             ch.pipeline().addLast(new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()[0]));
                             ch.pipeline().addLast(new StringDecoder());
                             ch.pipeline().addLast(new ServerHandler(messageControllerImpl));
                             //中介者handler
                             ch.pipeline().addLast(new StringEncoder());
                         }
                     });
            ChannelFuture f = bootstrap.bind(ConfigUtil.getNettyPort()).sync();
            InetAddress netAddress = InetAddress.getLocalHost();
            logger.info(">>>>>>>>>>netty statrt successfully!");
//            f.channel().closeFuture().sync();//获取channel的CloseFuture,阻塞当前线程直到关闭操作完成
            
            
        } catch (Exception e) {
            e.printStackTrace();
            parentGroup.shutdownGracefully();
            childGroup.shutdownGracefully();
        }
        
    }

    //程序启动初始化该类
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        this.start();
    }
阅读 6.2k
3 个回答
新手上路,请多包涵

我也碰到过这个问题,我的解决办法是在springboot里写一个listener,当springboot容器销毁时调用netty的shutdownGracefully方法,就可以关闭netty服务了

新手上路,请多包涵

大兄弟,你这问题解决了吗,能否给个方案

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题