0

我们正在从 Servlet 启动一个外部进程。

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

  • servlet 不等待外部进程完成。

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

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

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

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

因此,Servlet 和外部进程之间似乎存在某种交互,导致该进程需要很长时间才能完成。几天来,我们一直试图弄清楚可能发生的事情,但一无所获。

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

4

1 回答 1

2

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

否则,生成的进程可能会阻塞等待它被消耗。这样做有点复杂 - 请参阅此答案及其链接文章以获取更多信息。

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

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

于 2013-10-09T15:57:40.463 回答