gpt4 book ai didi

java - 从 Java Web 服务启动外部进程的最佳方式?

转载 作者:行者123 更新时间:2023-12-02 07:56:33 25 4
gpt4 key购买 nike

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

我已经试过了:

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

还有:

Runtime.exec(cmdString);

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

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

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

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

  • 我们尝试启动的过程需要数小时才能完成,因此在网络服务中等待完成(使用 waitfor())并不是理想的情况。
  • 是的,我们试图从 web 服务开始的过程是由一位团队成员创建的[提示:你的眼睛转动……现在]

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

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

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

最佳答案

简单地说:如果启动的应用程序写入 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);
}
}

关于java - 从 Java Web 服务启动外部进程的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/644511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com