Java Servlets - 如何同步ProcessBuilder?

Java Servlets - how to synchronize ProcessBuilder?

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

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

我考虑过 java 同步块 - 但我的理解是它们更适合共享资源,例如文件和 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 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() ;
}