【问题标题】:function called when java application server is stopped using GUI on eclipse [duplicate]在eclipse上使用GUI停止Java应用程序服务器时调用的函数[重复]
【发布时间】:2015-05-05 18:42:48
【问题描述】:

我有一个关于在 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");
  }

但是,“服务器已停止”语句从未打印在屏幕上。谁能告诉服务器停止时显式调用了哪个函数?

提前致谢。

【问题讨论】:

  • 最好关闭监听器是一个 finally 块。

标签: java eclipse server


【解决方案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() 并导致它抛出 SocketException,并且然后它将打印Server Stopped

明确的事实:mainThread.join() 行将使停止命令等到程序完全退出才真正终止,从而允许您进行所有清理。

编辑:抱歉所有的编辑,回到 SO 的摇摆。

【讨论】:

  • 请否决解释?
猜你喜欢
  • 1970-01-01
  • 2014-08-24
  • 2017-08-15
  • 2021-11-19
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
相关资源
最近更新 更多