如何在服务器模式下将OpenOffice用作multithreading服务?

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

我正在使用Java。

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

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

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

使用当前版本的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")); 

OpenOffice可以在无头模式下使用,但它还没有被构建为在压力很大的生产环境中处理大量请求。

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

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

如建议的那样,jodconverter可用于访问OpenOffice进程。

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

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

当需要转换时,我调用JODConverterconvertPDF 。 只有在应用程序关闭时才会停止。

Vlad在不同端口上运行多个OpenOffice实例是正确的。

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

你可以试试这个:

http://www.jopendocument.org/

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