在eclipse上使用GUI停止java应用程序服务器时调用的函数

时间:2015-05-05 18:42:49

标签: java eclipse server

关于在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");
  }

但是,屏幕上永远不会打印“服务器已停止”语句。任何人都可以告诉服务器停止时显式调用哪个函数?

提前致谢。

1 个答案:

答案 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的摇摆。