繁体   English   中英

process.waitFor() 不返回

[英]process.waitFor() not returning

我想从 Postgres SQL 脚本迁移数据。 我正在使用下面的代码。

void importDatabase() {

        final Process process = Runtime.getRuntime().exec("psql -f ./test.sql postgresql://postgres:root@127.0.0.1:5432/testdb");

        //Wait to get exit value
        try {
            if (process.waitFor() != 0) {
                String line;
                BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                while ((line = input.readLine()) != null) {
                    log.error(line);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}

waitFor不返回任何东西,它只是永远等待。

注意:我的test.sql有很多查询,所以它会显示很多日志条目。

题:

  1. 如何解决这个问题呢?

  2. 如果这与缓冲存储器有关,我该如何清除缓冲区?

谢谢你。

如果一个由Runtime.exec()执行的进程产生输出——无论是stdoutstdout还是stderr那么为了让它稳健运行,你需要在调用Process.waitFor()之前开始使用输出。 最有可能的是,您的psql进程被阻塞,因为它正在等待读取其输出的内容,并且在Process.waitFor()完成之前您不会开始这样做。

您可能需要在单独的线程中使用输出,除非您确切知道预期的输出。 在任何情况下,您对psql的调用可能有问题,也可能没有问题——除非您捕获它的输出,否则您可能不知道。

Runtime.exec()健壮和便携使用非常困难。 我已经详细地写过这个,并附有代码示例,在这里:

http://kevinboone.me/exec.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM