概述
之前主动关闭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服务端主动关闭问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复