如何在服务器模式下将OpenOffice用作多线程服务?

use*_*898 20 java multithreading openoffice.org

在服务器模式下使用OpenOffice有什么经验?我知道OpenOffice不是多线程的,现在我需要在我们的服务器中使用它的服务.
我该怎么做才能克服这个问题?

我正在使用Java.

Bas*_*erg 7

使用当前版本的JODConverter(3.0-SNAPSHOT),在无头模式下处理OOo的多个线程非常容易,因为库现在支持启动多个实例并将它们保存在池中,只需提供多个端口号或命名构造OfficeManager实例时的管道:

final OfficeManager om = new DefaultOfficeManagerConfiguration()
  .setOfficeHome("/usr/lib/openoffice")
  .setPortNumbers(8100, 8101, 8102, 8103)
  .buildOfficeManager();

om.start();
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用库来转换文档,而无需在后台处理OOo实例池:

OfficeDocumentConverter converter = new OfficeDocumentConverter(om);
converter.convert(new File("src/test/resources/test.odt"), new File("target/test.pdf"));
Run Code Online (Sandbox Code Playgroud)


vla*_*adr 5

是的,我使用OpenOffice作为文档转换服务器.

不幸的是,您的问题的解决方案是生成一个OpenOffice进程池.

JODConverter 的commons-pool分支(在移动之前code.google.com)为您实现了这个开箱即用的功能.


Ulu*_*yev 5

谢谢巴斯蒂安。根据巴斯蒂安的回答,我找到了另一种方法。打开多个端口,它提供创建多线程的访问。但是,如果没有很多端口(足够几个),我们可以通过增加task queue timeout 此处的文档来提高性能。再说一遍,我们决定不在start每个stop officeManager转换过程中进行。最后,我通过这种方法解决了这个任务:

public class JODConverter {

    private static volatile OfficeManager officeManager;
    private static volatile OfficeDocumentConverter converter;

    public static void startOfficeManager(){
        try {

            officeManager = new DefaultOfficeManagerConfiguration()
                    .setOfficeHome(new File('libre office home path'))
                    .setPortNumbers(8100, 8101, 8102, 8103, 8104 )  
                    .setTaskExecutionTimeout(600000L)    // for big files
                    .setTaskQueueTimeout(200000L)        // wait if all port were busy
                    .buildOfficeManager();
            officeManager.start();

            // 2) Create JODConverter converter
            converter = new OfficeDocumentConverter(officeManager);

        } catch (Throwable e){
            e.printStackTrace();
        }
    }

    public static void convertPDF(File inputFile, File outputFile) throws Throwable {

        converter.convert(inputFile, outputFile);
    }

    public static void stopOfficeManager(){
        officeManager.stop();
    }

}
Run Code Online (Sandbox Code Playgroud)

当需要转换时我打电话给JODConverter's 。convertPDF仅当应用程序关闭时才会停止。