Java servlet-如何同步ProcessBuilder?
我想这不一定是一个与servlet相关的问题,但我正在使用servlet设置中的代码来提供一些背景信息。我通过ProcessBuilder使用windows cscript工具将MS Office文档(如ppt、文档等)转换为PDF。我有一个vb脚本可以实现这一点 我过去注意到的一个问题是,一些应用程序(powerpoint)不能在无窗口环境中运行;也就是说,vb脚本在运行时会短暂弹出一个PowerPoint窗口。PowerPoint是一个单实例应用程序,所以当您尝试同时运行此脚本时会出现问题 我考虑过java同步块,但我的理解是,它们更倾向于共享资源,如文件和IO资源,我不认为它们能够正确地控制对ProcessBuilder正在执行的特定脚本的访问 代码示例:Java servlet-如何同步ProcessBuilder?,java,concurrency,processbuilder,Java,Concurrency,Processbuilder,我想这不一定是一个与servlet相关的问题,但我正在使用servlet设置中的代码来提供一些背景信息。我通过ProcessBuilder使用windows cscript工具将MS Office文档(如ppt、文档等)转换为PDF。我有一个vb脚本可以实现这一点 我过去注意到的一个问题是,一些应用程序(powerpoint)不能在无窗口环境中运行;也就是说,vb脚本在运行时会短暂弹出一个PowerPoint窗口。PowerPoint是一个单实例应用程序,所以当您尝试同时运行此脚本时会出现问题
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();
您可以锁定对整个process builder的访问:
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() ;
}