Java-приложение завершается с кодом ошибки при использовании завершения работы - PullRequest
0 голосов
/ 31 января 2019

У меня есть приложение ServerSocket, которое завершается, когда пользователь вводит Ctrl + C на терминале.Очистка завершения приложения выглядит нормально, но когда я пытался увидеть возвращенный код процесса, он выдает код ошибки 143 для SIGTERM и 130 для SIGINT. Я бы хотел, чтобы процесс возвратил 0, потому что задание было успешно выполнено .


Мой код:

public class Application {
    public static void main(String[] args) {
        WebService webService = new WebService(9999);
        Thread serviceThread = new Thread(webService);
        serviceThread.start();

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            webService.stop();

            try {
                serviceThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }));
    }
}

public class WebService implements Runnable {
    private int port;
    private ServerSocket socket;

    public WebService(int port) {
        this.port = port;
    }

    @Override
    public void run() {
        try {
            socket = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while (!socket.isClosed()) {
            try {
                socket.accept();
                System.out.println("New client connected!");
            } catch (IOException e) {
                if (!socket.isClosed())
                    e.printStackTrace();
                break;
            }
        }

        cleanup();
    }

    private void cleanup() {
        System.out.println("Stopping server");
        for (int i = 0; i < 3; i++) {
            try {
                System.out.print(".");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("\nServer stopped!");
    }

    public void stop() {
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Running the application:
$ java -jar App.jar || echo $?
Stopping server
...
Server stopped!
130

Отправка сигнала в приложение:

kill -s SIGINT <pid>
...