我是靠谱客的博主 勤恳热狗,最近开发中收集的这篇文章主要介绍ps:Netty服务端主动关闭问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

之前主动关闭nettyserver是在serverhandler中通过ctx.channel().parent().close();直接关闭serversocketchannel,触发关闭事件,使得sync()不在阻塞线程。
另外的方法就是设置一个静态的关闭服务器方法,在外部调用。方法的具体代码之前也有提及,这篇主要是进行测试。
主要是服务端测试:

public class TestServer {
    Remote_game_interface Tx_net = new Player_info_find(); // 接口实现类,也就是服务
    NettyRpcServer rpcServer = new NettyRpcServer("127.0.0.1", 9999); //服务器
    Runnable connect = new Runnable() {
        @Override
        public void run() {
            rpcServer.serviceRegister(Tx_net);
            rpcServer.connect();
        }
    };

    Runnable close = new Runnable() {
        @Override
        public void run() {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("开始断开服务器");
                NettyRpcServer.closeServer();
        }
    };
    public static void main(String[] args) throws InterruptedException {
        TestServer test = new TestServer();
        Thread close = new Thread(test.close);
        close.start();
        Thread connect = new Thread(test.connect);
        connect.start();
    }

}

主要思路就是创建两个线程,一个是连接服务器线程,逻辑和之前的测试连接思路一样;另外一个是关闭线程,直接调用暴露出来的强制关闭服务器方法。需要注意的是在关闭线程close前面加一个延时30s,防止还未连接就关闭,达不到测试效果。同时sync()阻塞的是connect线程,因此在main函数中connect和close的启动顺序无所谓。
PPS:
之前有一个弯路,想要把new出来的rpcServer对象同步,也就是synchronized (rpcserver),实现两个线程对该对象进行操作,这样强制关闭的方法不需要是静态的了。使用同步代码块需要在close线程中获取rpcserver的锁。然后调用notify()方法来唤醒connect线程。但是由于阻塞的问题,close线程拿不到锁(sync()底层源码来看锁的谁嘛?),因此也无法对connect线程唤醒。
问题就在sync()锁的谁呢?除了netty自带的close方法还有什么方法来唤醒阻塞线程?可能要抠底层了⑧。。。下面是不成功的代码

public class TestServer {
    Remote_game_interface Tx_net = new Player_info_find(); // 接口实现类,也就是服务
    NettyRpcServer rpcServer = new NettyRpcServer("127.0.0.1", 9999); //服务器
    Runnable connect = new Runnable() {
        @Override
        public void run() {
            synchronized (rpcServer){
                rpcServer.serviceRegister(Tx_net);
                rpcServer.connect();
            }

        }
    };

    Runnable close = new Runnable() {
        @Override
        public void run() {
            synchronized (rpcServer){
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("开始断开服务器");
                rpcServer.notify();
            }

        }
    };
    public static void main(String[] args) throws InterruptedException {
        TestServer test = new TestServer();
        Thread connect = new Thread(test.connect);
        connect.start();
        Thread close = new Thread(test.close);
        close.start();
    }

}

最后

以上就是勤恳热狗为你收集整理的ps:Netty服务端主动关闭问题的全部内容,希望文章能够帮你解决ps:Netty服务端主动关闭问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部