jodconverter already running问题解决

使用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;
	}

猜你喜欢

转载自blog.csdn.net/lxhjh/article/details/80254295
今日推荐