0

我正在从 Java 运行 wkhtmltopdf。我创建了一个进程,但这个进程似乎挂起,因为它在控制台上一次又一次地重复,也在任务管理器中。

这就是我运行 wkhtmltopdf 的方式:

String command = applicationLocation + "wkhtmltopdf.exe -O Landscape " + reqURL + "?" + reqQuery + " c:/PDF/" + folderName + "/" + id + "/" + folderName + ".pdf";
Process p = Runtime.getRuntime().exec(command);

工作完成后,我怎样才能“破坏”这个过程?

这对我不起作用,进程从未停止,代码也从未进入 while 循环:

ProcessBuilder pb = new ProcessBuilder(application, htmlFilePath, pdfFilePath);
Process process = pb.start();

BufferedReader errStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
System.out.println("read errstreamreader");
//not "process.getInputStream()" 

String line = null;

line = errStreamReader.readLine(); 
while(line != null) { 
    System.out.println(line); 
    line = errStreamReader.readLine(); 

    if(line.equals("Done")) {
        process.destroy();
        System.out.println("destroyed process");
    }
} 
4

2 回答 2

0

那是一个非常丑陋的问题。我的代码导致了循环。我调用了这个类,它使用以下代码从 servlet 生成 PDF:

// create pdf
if(action != null && action.equals("pdf")) {
    String reqURL = request.getRequestURL().toString();
    String reqQuery = "id=" + bomModuleId+ "&action=pdf";
    String folderName = "doonot";
    GeneratePDF obj = new GeneratePDF();
    obj.genrateCmd(reqURL, "xxx", "xxx", reqQuery, folderName, "10.07.2012");  
}

事实证明,wkhtmltopdf 使用完全相同的 URL,因此它向该页面发出请求,进入此循环,并再次调用 wkhtmltopdf。所以我最终进入了大约 450 个 wkhtmltopdf 进程,一切都崩溃了。

解决方案:我删除了"&action=pdf"

于 2012-07-12T07:02:06.693 回答
0

事实证明,我也遇到了同样的问题:循环 wkhtmltopdf 会创建一堆进程,导致我的机器运行 Windows 7 大幅减速。

wkhtmltopdf 的问题并不像 Runtime exec 那样。它会创建更多 wkhtmltopdf 进程,而无需等待之前的任何进程完成,直到系统资源不足导致您的计算机冻结。

我的解决方案:添加p.waitFor(). 它将等待 wkhtmltopdf 进程完成,然后继续循环。

这个解决方案可能仍然很慢,因为现在一个大的 html 文件会减慢循环的完成速度。所以,如果你想要一个更快的解决方案,我建议使用--read-from-stdinwkhtmltopdf 中的选项。

至于阅读 wkhtmltopdf 的输出,我建议查看这个问题及其所有答案。

于 2012-07-19T06:39:47.743 回答