在服务器模式下使用OpenOffice是什么体验?我知道 OpenOffice 不是多线程的,现在我需要在我们的服务器中使用它的服务。
我能做些什么来克服这个问题?
我正在使用 Java。
在服务器模式下使用OpenOffice是什么体验?我知道 OpenOffice 不是多线程的,现在我需要在我们的服务器中使用它的服务。
我能做些什么来克服这个问题?
我正在使用 Java。
使用当前版本的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 进程池。
JODConverter的commons-pool分支(在移至 之前code.google.com
)为您实现了这个开箱即用的功能。
谢谢巴斯蒂安。_ 根据巴斯蒂安的回答,我找到了另一种方法。打开几个端口,它提供了创建多线程的访问权限。但是如果没有很多端口(足够几个),我们可以通过增加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
's convertPDF
。它只会在应用程序关闭时停止。
OpenOffice 可以在无头模式下使用,但它还不能在压力很大的生产环境中处理大量请求。
在无头模式下使用 OpenOffice 有几个问题:
如建议的那样,jodconverter 可用于访问 OpenOffice 进程。
你可以试试这个:
它是一个基于 Java 的开源库,允许您在没有打开办公室的情况下处理打开的办公室文档,从而消除了对 OOserver 的需要。
Vlad 关于必须在不同端口上运行多个 OpenOffice 实例是正确的。
我只想补充一点,OpenOffice 似乎不稳定。我们在生产环境中运行它的 10 个实例,并将代码设置为在第一次尝试失败时重试另一个实例。这样,当其中一台 OpenOffice 服务器崩溃(或不崩溃但也不响应)时,生产不会受到影响。由于每天重启服务器很痛苦,我们正在慢慢地将所有文档转换为JasperReports(有关详细信息,请参阅 iReport)。我不确定您是如何使用 OpenOffice 服务器的;我们用它来合并邮件(为客户填写表格)。如果您需要将内容转换为 PDF,我推荐iText。