如何在服务器模式下将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进程。
谢谢巴斯蒂安 。 我找到了另一种方法,基于巴斯蒂安的答案。 打开几个端口,它提供了创建multithreading的访问权限。 但是没有很多端口(有几个)我们可以通过增加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(); } }
当需要转换时,我调用JODConverter
的convertPDF
。 只有在应用程序关闭时才会停止。
Vlad在不同端口上运行多个OpenOffice实例是正确的。
我想补充一点,OpenOffice似乎并不稳定。 我们在生产环境中运行它的10个实例,如果第一次尝试失败,则将代码设置为重新尝试另一个实例。 这样,当其中一个OpenOffice服务器崩溃(或者没有崩溃但也没有响应)时,生产不会受到影响。 由于每天不断重新启动服务器很痛苦,我们正在慢慢将所有文档转换为JasperReports (有关详细信息,请参阅iReport)。 我不确定你是如何使用OpenOffice服务器的; 我们将它用于邮件合并(为客户填写表格)。 如果您需要将内容转换为PDF,我建议使用iText 。