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

时间:2009-03-09 06:53:23

标签: java multithreading openoffice.org

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

我正在使用Java。

6 个答案:

答案 0 :(得分:7)

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

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

om.start();

然后,您可以将我们的图书馆,例如用于转换文档而无需在后台处理OOo实例池:

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

谢谢Bastian。我找到了另一种方法,基于巴斯蒂安的答案。打开几个端口,它提供了创建多线程的访问权限。但是,如果没有多个端口(需要几个端口),我们可以通过增加task queue timeout here is a documentation来提高性能。还有一件事,我们决定不在每个转换过程中startstop 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();
    }

}

当需要转换时,我致电JODConverter' s convertPDF。只有在应用程序关闭时才会停止。

答案 3 :(得分:2)

OpenOffice可用于无头模式,但尚未构建为在压力大的生产环境中处理大量请求。

在无头模式下使用OpenOffice有几个问题:

  • 该过程可能会死亡/无法使用。
  • 有几个内存泄漏问题。
  • 打开几个OpenOffice“worker”并没有按预期扩展,需要进行一些调整以确实有不同的开放过程(有几个OpenOffice副本,多个服务,在不同用户下运行。)

根据建议,jodconverter可用于访问OpenOffice进程。

http://code.google.com/p/jodconverter/wiki/GettingStarted

答案 4 :(得分:1)

Vlad必须在不同的端口上运行多个OpenOffice实例。

我想补充一点,OpenOffice似乎并不稳定。我们在生产环境中运行它的10个实例,如果第一次尝试失败,则将代码设置为重新尝试另一个实例。这样,当其中一个OpenOffice服务器崩溃(或者没有崩溃但也没有响应)时,生产不会受到影响。由于每天不断重启服务器很痛苦,我们正在慢慢将所有文档转换为JasperReports(有关详细信息,请参阅iReport)。我不确定你是如何使用OpenOffice服务器的;我们将它用于邮件合并(为客户填写表格)。如果您需要将内容转换为PDF,我建议iText

答案 5 :(得分:1)

你可以试试这个:

http://www.jopendocument.org/

它是一个基于java的开源库,允许您在没有开放办公室的情况下处理开放式办公文档,从而无需使用OOserver。