Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java servlet-如何同步ProcessBuilder?_Java_Concurrency_Processbuilder - Fatal编程技术网

Java servlet-如何同步ProcessBuilder?

Java servlet-如何同步ProcessBuilder?,java,concurrency,processbuilder,Java,Concurrency,Processbuilder,我想这不一定是一个与servlet相关的问题,但我正在使用servlet设置中的代码来提供一些背景信息。我通过ProcessBuilder使用windows cscript工具将MS Office文档(如ppt、文档等)转换为PDF。我有一个vb脚本可以实现这一点 我过去注意到的一个问题是,一些应用程序(powerpoint)不能在无窗口环境中运行;也就是说,vb脚本在运行时会短暂弹出一个PowerPoint窗口。PowerPoint是一个单实例应用程序,所以当您尝试同时运行此脚本时会出现问题

我想这不一定是一个与servlet相关的问题,但我正在使用servlet设置中的代码来提供一些背景信息。我通过ProcessBuilder使用windows cscript工具将MS Office文档(如ppt、文档等)转换为PDF。我有一个vb脚本可以实现这一点

我过去注意到的一个问题是,一些应用程序(powerpoint)不能在无窗口环境中运行;也就是说,vb脚本在运行时会短暂弹出一个PowerPoint窗口。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();
您可以锁定对整个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() ;
}