Servlet启动外部进程

时间:2013-10-09 15:55:31

标签: java servlets runtime

我们正在从Servlet开始一个外部进程。

try {
    Process proc = Runtime.getRuntime().exec("java  -jar " + jarLocation );
  • servlet和外部进程使用相同的userid / pwd访问同一个数据库。

  • servlet执行不等待以完成外部流程。

  • servlet在不到一秒的时间内完成了'处理。

  • 从Servlet启动时,外部应用程序至少需要两分钟才能完成。

  • 在独立模式下运行时,外部应用程序大约需要5秒钟才能完成。

我们尝试在外部流程启动后停止Web应用程序,这导致外部流程立即完成。

因此,Servlet和外部进程之间似乎存在某种交互,导致进程花费太长时间才能完成。我们一直试图找出几天可能发生的事情并且无处可去。

有没有人知道这里会发生什么?

1 个答案:

答案 0 :(得分:2)

您需要在servlet进程中使用生成的进程'stdout / stderr。

否则,生成的进程可能会阻止等待它被消耗。执行此操作有点复杂 - 有关详细信息,请参阅this answer及其linked article

请注意,您应该执行Process.waitFor()来收集生成的进程退出代码。否则你的手上会有一个僵尸。因此,可能希望将所有这些包装在一个单独的线程中,以便您的servlet可以生成进程并立即返回。

说了这么多,如果你正在启动一个新的Java进程,你不能简单地重构它,以便你在同一个JVM中将它称为库函数吗?产卵过程是一项相对繁重且耗时的任务。