2

我继承了 Java Web 服务代码库(BEA/Oracle Weblogic),需要从 Web 服务启动/启动外部后台应用程序。

我已经尝试过:

ProcessBuilder pb = new ProcessBuilder(arg);
pb.start();

也:

Runtime.exec(cmdString);

但是在以这种方式启动应用程序时遇到了奇怪的行为(即,即使进程仍然处于活动状态,启动的应用程序也会停止工作。——从普通命令行手动运行时应用程序工作正常)。

有没有更好的方法来启动外部进程?

编辑: - - - - - - - - - - -

我有一些额外的信息可能有助于阐明这个问题。

  • 我们尝试开始的过程需要几个小时才能完成,因此在 web 服务中等待完成(使用waitfor())将不是一个理想的场景。
  • 是的,我们试图从 web 服务开始的过程是由团队成员创建的 [提示:你的眼睛滚动......现在]

当我使用进程构建器启动 bash 脚本时,我取得了成功,其中外部应用程序作为后台进程启动(使用“&”)。

#!/bin/bash
java -jar myApp.jar &

这显然会创建一个孤立的进程,但至少应用程序确实会继续执行。

4

5 回答 5

2

首先,这是发生在 Windows 上还是 Linux 上?另外,启动的应用程序或多或少应该做什么?(它是一个脚本吗?它是一个二进制文件吗?它是你的二进制文件吗?)

编辑

好的,所以启动一个bash脚本(使用ProcessBuilder),然后生成一个新的 JVM(java -jar myApp.jar)可以工作。

当您尝试直接使用生成新的 JVM 时会发生什么ProcessBuilder?你原来说:

启动的应用程序停止工作

  1. 启动的应用程序是指“java -jar myApp.jar”,当直接调用时,而不是通过中间bash脚本?
  2. ProcessBuilder当您尝试直接启动 Java 并且这个新的 JVM 停止工作时,您传递给各种方法(以及以何种顺序)的确切和完整参数(及其值)是什么?(例如提供带注释的代码)
  3. 如果您安装lsof在 *nix 机器上,运行时显示与文件描述符 2 相关联的文件(查看FD列):(“挂起”JVM 的进程 ID 在lsof -p 1234哪里?)附加此处命令1234的完整输出。lsof
  4. 您在上面的步骤 3 中标识的文件(对于文件描述符 2)附加了什么,在您发出命令后最多几秒钟:(“挂起”JVM 的进程 ID 在kill -QUIT 1234哪里?)1234
于 2009-03-14T03:56:15.940 回答
2

通过“即使进程仍然处于活动状态也停止工作”我假设您可能期望从您启动的应用程序中获得一些输出而没有得到任何东西。

尝试使用以下内容:

ProcessBuilder pb = new ProcessBuilder(arg);
Process p = pb.start();
p.waitFor();

如有必要,waitFor() 使当前线程等待,直到此 Process 对象表示的进程终止。

http://java.sun.com/javase/6/docs/api/java/lang/Process.html#waitFor()

于 2009-03-14T20:17:37.370 回答
2

简单地说:如果启动的应用程序写入 SDTOUT/STDIN 并且您不经常刷新它们(请参阅 Process.getErrorStream/Process.getInputStream),那么当缓冲区已满时进程将阻塞(非常小,4KB 或更少) .

我建议您在开始流程之前调用 ProcessBuilder.redirectErrorStream() 。然后,之后,使用 run() 方法创建一个线程,如下所示:

public void run() {
    BufferedReader reader = 
        new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}
于 2009-03-17T21:57:48.393 回答
1

您是否正确处理流程的标准输入和输出?如果您的应用程序正在处理标准输入或输出并且您没有正确处理它,那么您执行的进程将挂起等待 I/O。

一种测试方法是编写一个运行程序的脚本,将标准输入、输出和错误重定向到文件。然后让您的 Web 服务应用程序运行脚本而不是程序。如果程序以这种方式运行完成,那么问题在于处理过程的输出。

于 2009-03-14T02:44:06.457 回答
0

我猜问题可能是启动进程的线程被终止或请求结束后的任何事情。尝试在应用程序中有一个您确定始终保持活动状态的单个线程,您可以通过从其他线程调用它来使用它来启动进程。

于 2009-03-13T20:39:18.970 回答