论坛首页 Java企业应用论坛

[吐槽]process.destroy()不能触发关闭钩子

浏览 3796 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-11-17  

本来是个对个体失效不太敏感的Worker进程
为了尽善尽美决定加个关闭钩子(其实是为了逃避半夜上线找个理由...)

于是开开心心的写了如下代码测试

        String path = "E:/IdeaProjects/WebClipper/out/test/boss/";
        Process process =
                new ProcessBuilder("java", "ShutdownHookTest")
                        .directory(new File(path))
                        .start();
        ProcessUtils.drainInBackgroundAndPrint(process.getInputStream());//这里只是输出而已
        Thread.sleep(5000l);
        process.destroy();
        process.waitFor();


        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                System.out.println("Hook run.");
            }
        });

        System.out.println("Just test.");

        while (true)
            Thread.sleep(1000l);


结果……
Just test.
Process finished with exit code 0


灰常不爽……

必须自己实现一个安全关闭

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        bw.write("exit");
        bw.flush();
        bw.close();


        new Thread(){
            @Override
            public void run() {
                try {
                    new BufferedReader(new InputStreamReader(System.in)).readLine();
                } catch (IOException ignored) {
                }
                System.exit(0);
            }
        }.start();


完全不优雅嘛,这样还不行,Worker进程我觉得是不能信任的
一段时间后还得调用process.destroy()还安全

与其这样还不如taskkill搞下?
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics