【问题标题】:Executing external Java program from a webapp从 webapp 执行外部 Java 程序
【发布时间】:2012-12-05 15:11:08
【问题描述】:

我正在尝试从在 Tomcat 6、Windows 7、64bit 上运行的 servlet 调用外部 Java 类文件。 已经有一些关于这个主题的主题,但没有一个对我有帮助。

仅供参考,如果我直接从 shell 运行它,我已经成功地做到了。

我使用ProcessBuilder 来执行这样的命令

 ProcessBuilder bp = new ProcessBuilder("cmd.exe","/C","java", "TheExternalClass", "ParameterA" });

我还在使用创建的 Process 中的 errorStream 和 inputStream。

当我从 servlet 运行它时,它只会停止。

例如,如果我将 java 命令切换到 dir,它确实按预期工作,这让我相信它与内存有关,或者与从 Tomcat 启动新 Java 进程或类似的问题有关。

任何人有关于如何解决这个问题的指针或好主意?

关于该主题的其他一些帖子:

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html?page=1

call a java program from a webapp in tomcat server - the java program is out side of tomcat server

Tomcat fails to execute external java program

非常感谢阅读。

【问题讨论】:

    标签: java tomcat exec external processbuilder


    【解决方案1】:

    上面的代码可以工作,它不会让你的 servlet 停顿。我的猜测是您稍后调用 p.waitFor() 或类似名称,或者您在 JSP 线程中读取进程的输出流 - 将阻塞。

    如果你不想屏蔽,你有两种选择:

    • 使用 AJAX 在后台轮询 JSP。 JSP 仍会阻塞,但浏览器将可用。
    • 创建一个读取输出流的后台线程。这将使 JSP 立即返回,但您必须找到一种方法将处理结果发送到浏览器,因为它不知道服务器上发生了什么。

    【讨论】:

    • 感谢您回复亚伦。你是对的,我正在调用 p.waitFor() 并从创建的进程中读取 errorStream 和 inputStream ,但我并没有真正用它做任何事情。您是否建议如果不读取这些流并且不调用 p.waitFor() 它会起作用吗?
    • 好吧,JSP 不会再阻塞了,但是如果它向 stdout/stderr 写入超过 4KB 的大小,那么该进程可能永远不会完成,并且当出现错误时,您永远不会知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多