2012-07-11 166 views
0

我從Java運行wkhtmltopdf。我創建了一個流程,但是這個流程似乎是懸而未決的,因爲它會一再地重複控制檯,也會在任務管理器中重複。wkhtmltopdf進程在Java中掛起

這是我如何運行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"); 
    } 
} 
+0

你期待一個錯誤?如果你沒有收到錯誤信息,你將永遠不會破壞這個過程。 – JavaKungFu 2012-07-11 14:28:18

+1

wkhtmltopdf默認寫入stderr。 – doonot 2012-07-11 14:28:59

回答

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 exactely使用相同的URL,因此給予該頁面的請求,在這個循環中降落,並呼籲wkhtmltopdf再次。所以我最終進入了450 wkhtmltopdf進程,並且一切都崩潰了。

解決方法:我刪除"&action=pdf"

0

事實證明,我也有同樣的問題:循環wkhtmltopdf創建了一堆進程,導致我的機器,運行Windows 7,急劇放緩。

這個問題與wkhtmltopdf沒有什麼關係,因爲它與Runtime exec相同。它創建了更多的wkhtmltopdf進程,無需等待任何前一個任務完成,直到缺乏系統資源凍結您的計算機。

我的解決方案:add p.waitFor()。它將等待wkhtmltopdf進程完成並繼續循環。

這個解決方案仍然很慢,因爲現在一個大型的html文件會減慢循環的完成。所以,如果你想要更快的解決方案,我建議使用wkhtmltopdf的--read-from-stdin選項。

至於閱讀wkhtmltopdf的輸出,我建議在看this question and ALL of its answers.