2012-12-05 132 views
0

我想從運行在Tomcat 6,Windows 7,64位上的servlet調用外部Java類文件。 這個問題上已經有一些線索,但沒有人真的幫助我。從webapp執行外部Java程序

Fyi,如果我直接從shell運行它,我已經能夠成功完成這項工作。

im使用一個ProcessBuilder到這樣

ProcessBuilder bp = new ProcessBuilder("cmd.exe","/C","java", "TheExternalClass", "ParameterA" }); 

我還從所創建的過程消耗errorStream和的inputStream執行該命令。

當我從servlet運行它時,它只是失速。

例如,如果我將java命令切換到dir,它可以按預期工作,這使我相信它與任何內存有關,或者從Tomcat啓動新的Java Process或類似的問題。

任何人都有一個指針或一個好主意,如何解決這個問題?

在話題的一些其他職位:

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html?page=1

call a java program from a webapp in tomcat server - the java program is out side of tomcat server

Tomcat fails to execute external java program

感謝很多的閱讀。

回答

1

上面的代碼工作,它不會拖延你的servlet。我的猜測是,您稍後調用p.waitFor()或類似的函數,或者您在JSP線程中讀取進程的輸出流 - 將會阻塞。

如果您不希望阻止,你有兩個選擇:

  • 使用Ajax輪詢JSP的背景。 JSP仍會阻塞,但瀏覽器將可用。
  • 創建讀取輸出流的後臺線程。這將使JSP立即返回,但您必須找到一種方法將流程結果發送到瀏覽器,因爲它不知道服務器上會發生什麼。
+0

謝謝你回覆Aaron。 你是對的,我打電話給p.waitFor()和我從創建的進程讀取errorStream和inputStream,但我沒有真正做它。你是否建議如果不讀取這些流並且不調用p.waitFor()它會起作用? –

+1

好吧,JSP不會再阻塞,但是如果它向stdout/stderr寫入超過4KB的數據,並且出現錯誤時,這個過程可能永遠不會結束,您永遠不會知道。 –