使用jodconverter调用LibreOffice 将office文档转换为PDF时。如果转换程序异常中止而libreOffice并没有停止运行的话。
再次运行转换程序时,通过启动LibreOffice服务再创建新的连接这种方式时就会导致异常发生jodconverter already running。
解决的方法:
1.在再次运行转换程序前将LiberOffice进程杀死。然后运行转换程序。
这种方法,在同一个tomcat中存在多个运用时,存在并发问题,回出现各种坑,不可取。
2.修改转换程序启动LibreOffice的方式,由单纯的创建并连接服务的形式,转换为先连接已经存在的服务,连接失败后创建服务并连接。
A、创建并连接服务:
public OfficeManager startOffice(){
try {
logger.info("准备启动服务....");
try {
logger.info("尝试连接已启动的服务...");
ExternalOfficeManagerConfiguration externalProcessOfficeManager = new ExternalOfficeManagerConfiguration();
externalProcessOfficeManager.setConnectOnStart(true);
externalProcessOfficeManager.setPortNumber(Integer.valueOf(getOfficePort()).intValue());
OfficeManager officeManager = externalProcessOfficeManager.buildOfficeManager();
officeManager.start();
logger.info("office转换服务启动成功!");
return officeManager;
} catch (Exception ex) {
logger.info("没有已启动的服务...");
}
logger.info("创建并连接新服务...");
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
configuration.setOfficeHome(getOfficehome());
configuration.setPortNumbers(Integer.valueOf(getOfficePort()).intValue());
configuration.setTaskExecutionTimeout(1000 * 60 * 5L);
configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);
OfficeManager officeManager = configuration.buildOfficeManager();
officeManager.start();
logger.info("office转换服务启动成功!");
return officeManager;
} catch (Exception ce) {
//ce.printStackTrace();
logger.error("office转换服务启动失败!详细信息:" + ce);
return null;
}
}
B、获取openoffice安装路径
private String getOfficehome(){
if(officehome == null){
officehome ="/opt/openoffice.org3/";
}
return officehome;
}
C、获取office所在端口号
private String getOfficePort(){
if(officePort == null){
officePort = "2003";
}
return officePort;
}