java—在tomcat容器中启动进程时遇到一个奇怪的错误如何解决?

lp0sw83n  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(418)

我创建了一个webapp来管理用户创建的任意作业。一个作业将一些文件复制到另一个文件夹并启动外部程序。外部程序使用批处理文件启动,批处理文件设置一些变量并启动另一个java程序,该程序将文件提交给服务器。我以如下方式启动批处理文件:

final ProcessBuilder pb = new ProcessBuilder("path/to/batch");

pb.directory("parent/folder/of/batch");

final Process p = pb.start();

p.waitFor();

批处理文件包含以下内容:

set CLASSPATH=%CLASSPATH%;<external-program.jar>
set PATH=%PATH%;C:\Program Files\Java\jre7\bin

@echo off
set puser=****
set ppsw=****

java -jar <external-program.jar> %puser% %ppsw%

进程开始但没有完成,我的webapp被阻止。如果我手动启动批处理文件,一切正常。现在真正奇怪的是:如果我聚焦tomcat窗口并使用 Ctrl-C 该过程继续工作,并以预期结果结束。怎么会这样?
最后的日志是:

[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "GET /something HTTP/1.1[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "Authorization: Basic****[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "User-Agent: Jakarta Commons-HttpClient/3.1[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "Host: some.host[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "[\r][\n]"

所以我认为它正在向服务器发出请求,然后被阻止。servlet容器在其中扮演了一个角色。我也试过使用jetty,但问题依然存在。使用其他端口 80 也不能解决问题。
我完全糊涂了,如果有人能帮我,我会很高兴的。
p、 答:我正在Windows7x64上使用Tomcat8.0.15。

huwehgph

huwehgph1#

默认情况下,如果不重定向任何描述符(stdin、stdout或stderr;或者不管它们在windows上的等价物是什么),它们都与创建它们的进程(在您的例子中是tomcat)共享它。
可能是进程尝试并写入stdout、stderr或两者,并且它阻止了对它/它们的写入。
尝试重定向到一个文件,例如 ProcessBuilder 你可以这样做(stdout,stderr)。
另外,检查 .waitFor() :这将是进程的退出值。因为调用了jar,所以 main() 这将使进程以代码1退出(这就是为什么当您自己编写程序时不应该使用此退出代码!)。

相关问题