关于在Eclipse上运行的Java应用程序服务器,我有一个非常基本的问题。我想在管理员希望停止服务器时执行一些代码,所以我正在寻找一个在管理员按下控制台上的“停止”按钮时调用的函数。
应用程序服务器运行正常,但我希望在服务器停止后清除数据库的状态。我的服务器代码如下:
public static void main(String[] args){
try{
while(true){
Socket s=listener.accept();
//do other stuff here
}}
//catch blocks
try{
listener.close();
}
//catch block
System.out.println("Server stopped");
}
但是,屏幕上永远不会打印“服务器已停止”语句。任何人都可以告诉服务器停止时显式调用哪个函数?
提前致谢。
答案 0 :(得分:-1)
将this answer中的ServerSocket.close()
与this answer中的关机挂钩相结合。
例如,你会这样做:
public class Main {
private static volatile boolean keepRunning = false;
public static void main(String[] args){
final ServerSocket listener = ... ;
final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
keepRunning = false;
listener.close();
mainThread.join();
}
});
try {
while (keepRunning) {
Socket s=listener.accept();
//do other stuff here
}
} catch (Exception e) {
}
// Do cleanup here
System.out.println("Server stopped");
}
}
然后,当你a)发出一个Ctrl-C或b)调用System.exit()
时,它会调用你的关闭钩子,它会关闭ServerSocket,它会中断ServerSocket.accept()
并导致它抛出一个{ {1}},然后会打印SocketException
。
干净的事实:Server Stopped
行将使stop命令等待,直到程序在实际终止之前完全退出,允许所有清理发生。
修改:对所有修改感到抱歉,回到SO的摇摆。