我们正在从Servlet开始一个外部进程。
try {
Process proc = Runtime.getRuntime().exec("java -jar " + jarLocation );
servlet和外部进程使用相同的userid / pwd访问同一个数据库。
servlet执行不等待以完成外部流程。
servlet在不到一秒的时间内完成了'处理。
从Servlet启动时,外部应用程序至少需要两分钟才能完成。
在独立模式下运行时,外部应用程序大约需要5秒钟才能完成。
我们尝试在外部流程启动后停止Web应用程序,这导致外部流程立即完成。
因此,Servlet和外部进程之间似乎存在某种交互,导致进程花费太长时间才能完成。我们一直试图找出几天可能发生的事情并且无处可去。
有没有人知道这里会发生什么?
答案 0 :(得分:2)
您需要在servlet进程中使用生成的进程'stdout / stderr。
否则,生成的进程可能会阻止等待它被消耗。执行此操作有点复杂 - 有关详细信息,请参阅this answer及其linked article。
请注意,您应该执行Process.waitFor()
来收集生成的进程退出代码。否则你的手上会有一个僵尸。因此,可能希望将所有这些包装在一个单独的线程中,以便您的servlet可以生成进程并立即返回。
说了这么多,如果你正在启动一个新的Java进程,你不能简单地重构它,以便你在同一个JVM中将它称为库函数吗?产卵过程是一项相对繁重且耗时的任务。