我想这不一定是与 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/