Java Servlet - 如何同步 ProcessBuilder?

标签 java concurrency processbuilder

我想这不一定是与 servlet 相关的问题 - 但我在 servlet 设置中使用代码来提供一些背景知识。我通过 ProcessBuilder 使用 Windows cscript 工具将 MS Office 文档(例如 ppt、doc 等)转换为 PDF。我有一个 vb 脚本可以执行此操作。

我过去注意到的一个问题是某些应用程序(powerpoint)无法在无窗口环境中运行;这是 vb 脚本,脚本运行时会短暂弹出一个 PowerPoint 窗口。 PowerPoint 是单实例应用程序,因此当您尝试同时运行此脚本时会出现问题。

我考虑过 java 同步块(synchronized block) - 但我的理解是它们更适合共享资源,例如文件和 IO 资源 - 并且不认为它们会正确控制对 ProcessBuilder 正在执行的特定脚本的访问。

代码示例:

ProcessBuilder pb = new ProcessBuilder("cscript", "C:\\Users\\Foo User\\Documents\\office2pdf.vbs", "C:\\Users\\Foo User\\Documents\\SomePPTFile.pptx"); 
            Process pr = pb.start();
            int i = pr.waitFor() ;

我过去使用过 OpenOffice,它有一个很好的 Java API - 但我更愿意坚持使用 MS Office,因为它在转换 PDF 方面做得更好。任何建议将不胜感激。

最佳答案

您可以在 servlet 中拥有私有(private)静态对象:

private static final Object processLock = new Object();

您可以锁定对整个流程构建器的访问:

synchronized (processLock)
{
    // only one servlet thread at a time in here...
    ProcessBuilder pb = new ProcessBuilder("cscript", "C:\\Users\\Foo User\\Documents\\office2pdf.vbs", "C:\\Users\\Foo User\\Documents\\SomePPTFile.pptx"); 
    Process pr = pb.start();
    int i = pr.waitFor() ;
}

关于Java Servlet - 如何同步 ProcessBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802190/

相关文章:

java - 对大型应用程序进行分析很困难

java - 如何在独立于环境的 META-INF 中打开文件

java - 哪个更有效,为什么?

linux - 从多个线程调用 accept()

java - 如何使用 Java 运行存储在 String 变量中的 shell 脚本?

java - Process Builder 无法在 Windows 上运行

java - RxJava : how to handle combineLatest() when one of the streams emits nothing

java.util.Scanner 在读取大文件时出现故障

multithreading - Haskell 如何在多核机器/集群上处理并行计算

java - 使用 processbuilder 从 java 执行 curl