2012-12-05 91 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的数据,并且出现错误时,这个过程可能永远不会结束,您永远不会知道。 –