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

发布于 2022-09-07 15:52:28 字数 2421 浏览 26 评论 0

最近手头上出现了一个问题,将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();
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眸中客 2022-09-14 15:52:28

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

清醇 2022-09-14 15:52:28

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

清旖 2022-09-14 15:52:28
public static EventLoopGroup eventLoopGroup = getEventLoopGroup();  
public static EventLoopGroup workGroup = getWorkGroup();  
private static EventLoopGroup getEventLoopGroup() {  
    if (eventLoopGroup == null) {  
        eventLoopGroup = new NioEventLoopGroup();  
    }  
    return eventLoopGroup;  
}  
  
private static EventLoopGroup getWorkGroup() {  
    if (workGroup == null) {  
        workGroup = new NioEventLoopGroup();  
    }  
    return workGroup;  
}
通过单例模式统一管理对象
/\*\*  
 \* 添加SpringBoot容器事件 \* @author Ming  
 \* @date 2020/01/2 09:42  
 \*/@Log4j  
public class ApplicationEventListener implements ApplicationListener {  
  
    @Override  
  public void onApplicationEvent(ApplicationEvent event) {  
        // 在这里可以监听到Spring Boot的生命周期  
  if (event instanceof ApplicationEnvironmentPreparedEvent) {  
            log.info("SpringBoot初始化环境变量");  
        } else if (event instanceof ApplicationPreparedEvent) {  
            log.info("SpringBoot初始化完成");  
        } else if (event instanceof ContextRefreshedEvent) {  
            log.info("SpringBoot应用刷新");  
        } else if (event instanceof ApplicationReadyEvent) {  
            log.info("SpringBoot应用已启动完成");  
        } else if (event instanceof ContextStartedEvent) {  
            log.info("SpringBoot应用启动,需要在代码动态添加监听器才可捕获 ");  
        } else if (event instanceof ContextStoppedEvent) {  
            log.info("SpringBoot应用停止");  
            RunNettyWebScoket.eventLoopGroup.shutdownGracefully();  
            RunNettyWebScoket.workGroup.shutdownGracefully();  
        } else if (event instanceof ContextClosedEvent) {  
            log.info("SpringBoot应用关闭");  
            RunNettyWebScoket.eventLoopGroup.shutdownGracefully();  
            RunNettyWebScoket.workGroup.shutdownGracefully();  
        } else {  
              
        }  
    }  
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文