在服务器模式下使用OpenOffice有什么经验?我知道OpenOffice不是多线程的,现在我需要在我们的服务器中使用它的服务 我该怎么做才能克服这个问题?
我正在使用Java。
答案 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来提高性能。还有一件事,我们决定不在每个转换过程中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
' s convertPDF
。只有在应用程序关闭时才会停止。
答案 3 :(得分:2)
OpenOffice可用于无头模式,但尚未构建为在压力大的生产环境中处理大量请求。
在无头模式下使用OpenOffice有几个问题:
根据建议,jodconverter可用于访问OpenOffice进程。
答案 4 :(得分:1)
Vlad必须在不同的端口上运行多个OpenOffice实例。
我想补充一点,OpenOffice似乎并不稳定。我们在生产环境中运行它的10个实例,如果第一次尝试失败,则将代码设置为重新尝试另一个实例。这样,当其中一个OpenOffice服务器崩溃(或者没有崩溃但也没有响应)时,生产不会受到影响。由于每天不断重启服务器很痛苦,我们正在慢慢将所有文档转换为JasperReports(有关详细信息,请参阅iReport)。我不确定你是如何使用OpenOffice服务器的;我们将它用于邮件合并(为客户填写表格)。如果您需要将内容转换为PDF,我建议iText。
答案 5 :(得分:1)