有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Javaservlet启动外部进程

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

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

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

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

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

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

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

因此,Servlet和外部进程之间似乎存在某种相互作用,导致该进程花费的时间太长而无法完成。几天来,我们一直在试图找出可能发生的事情,但一无所获

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


共 (1) 个答案

  1. # 1 楼答案

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

    否则,生成的进程可能会阻塞,等待它被使用。这样做有点复杂——更多信息请参见this answer及其linked article

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

    话虽如此,如果您要启动一个新的Java进程,您不能简单地重构它,以便从同一个JVM中将其作为库函数调用吗?产卵过程是一项相对较重且耗时的任务