package com.product.file.util;
|
|
import com.alibaba.druid.util.StringUtils;
|
import com.product.core.config.Global;
|
import com.product.core.spring.context.SpringMVCContextHolder;
|
import com.product.file.config.FileCode;
|
import org.artofsolving.jodconverter.OfficeDocumentConverter;
|
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
|
import org.artofsolving.jodconverter.office.ExternalOfficeManagerConfiguration;
|
import org.artofsolving.jodconverter.office.OfficeException;
|
import org.artofsolving.jodconverter.office.OfficeManager;
|
|
import java.io.File;
|
import java.util.Properties;
|
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
/**
|
* Copyright © 6c
|
* @Date: 2021-03-01 13:59
|
* @Author: 6c
|
* @Description:
|
*/
|
public class PdfConcurrenceUtil {
|
|
private static BlockingQueue<OfficeManager> officeManagerQueue = new LinkedBlockingQueue<>();
|
|
// 安装地址
|
private static String openOfficeHome;
|
// 端口号信息,逗号分割
|
private static String portInfo;
|
// 单个任务执行超时时间,单位:毫秒
|
private static long taskTimeout;
|
// 单个任务排队超时时间,单位:毫秒
|
private static long queueTimeout;
|
|
static {
|
SpringMVCContextHolder.getSystemLogger().info("初始化->");
|
//init();
|
}
|
|
private PdfConcurrenceUtil() {}
|
|
/**
|
* 初始化转换服务
|
*/
|
public static boolean init() {
|
SpringMVCContextHolder.getSystemLogger().info("初始化转换服务->");
|
openOfficeHome = Global.getSystemConfig("open.office.home","");
|
portInfo = Global.getSystemConfig("open.office.port.info","");
|
taskTimeout = StringUtils.isEmpty(Global.getSystemConfig("open.office.task.timeout","")) ? 1000 * 60 *5 : Long.parseLong(Global.getSystemConfig("open.office.task.timeout",""));
|
queueTimeout = StringUtils.isEmpty(Global.getSystemConfig("open.office.queue.timeout","")) ? 1000 * 60 *5 : Long.parseLong(Global.getSystemConfig("open.office.queue.timeout",""));
|
|
String[] portArr = portInfo.split(",");
|
for (String port : portArr) {
|
if (StringUtils.isEmpty(port)) {
|
continue;
|
}
|
try {
|
OfficeManager officeManager = start(Integer.parseInt(port));
|
if (officeManager != null) {
|
officeManagerQueue.put(officeManager);
|
} else {
|
SpringMVCContextHolder.getSystemLogger().error(String.format("端口%s启动失败", port));
|
}
|
} catch (InterruptedException e) {
|
SpringMVCContextHolder.getSystemLogger().error(String.format("%s,port:%s", FileCode.INIT_TRANSFER_SERVER_FAIL.getText(), port) + e.getMessage());
|
}
|
}
|
SpringMVCContextHolder.getSystemLogger().info("当前转换队列中端口数:" + officeManagerQueue.size());
|
return true;
|
}
|
|
/**
|
* 开启新的openoffice的进程
|
* @param port
|
* @return
|
*/
|
private static OfficeManager start(int port) {
|
try {
|
SpringMVCContextHolder.getSystemLogger().info("curPort: " + port);
|
OfficeManager officeManager = reconnect(port);
|
if (officeManager == null) {
|
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
|
configuration.setOfficeHome(openOfficeHome);
|
configuration.setPortNumbers(port);
|
configuration.setTaskExecutionTimeout(taskTimeout);
|
configuration.setTaskQueueTimeout(queueTimeout);
|
SpringMVCContextHolder.getSystemLogger().info( "1.启动"+port);
|
officeManager = configuration.buildOfficeManager();
|
SpringMVCContextHolder.getSystemLogger().info("2.启动"+port);
|
officeManager.start(); // 启动服务
|
SpringMVCContextHolder.getSystemLogger().info( "3.启动成功"+ port);
|
}
|
return officeManager;
|
} catch (Exception e) {
|
e.printStackTrace();
|
SpringMVCContextHolder.getSystemLogger().error(String.format("%s:%s", FileCode.INIT_TRANSFER_SERVER_FAIL.getText(), port) + e.getMessage());
|
}
|
return null;
|
}
|
|
/**
|
* 尝试连接openoffice的已存在的服务器
|
* @param port
|
* @return
|
*/
|
private static OfficeManager reconnect(int port) {
|
try {
|
ExternalOfficeManagerConfiguration externalProcessOfficeManager = new ExternalOfficeManagerConfiguration();
|
externalProcessOfficeManager.setConnectOnStart(true);
|
externalProcessOfficeManager.setPortNumber(port);
|
OfficeManager officeManager = externalProcessOfficeManager.buildOfficeManager();
|
officeManager.start();
|
return officeManager;
|
} catch (OfficeException e) {
|
SpringMVCContextHolder.getSystemLogger().info(String.format("%s,port:%s", FileCode.NO_EXISTS_TRANSFER_PORT.getText(), port));
|
return null;
|
}
|
}
|
|
/**
|
* 销毁进程
|
*/
|
private static void destory() {
|
for (OfficeManager officeManager : officeManagerQueue) {
|
stop(officeManager);
|
}
|
}
|
|
/**
|
* 使用完需要关闭该进程
|
* @param officeManager
|
*/
|
private static void stop(OfficeManager officeManager) {
|
SpringMVCContextHolder.getSystemLogger().info("关闭OpenOffice服务");
|
try {
|
if (officeManager != null)
|
officeManager.stop();
|
} catch (Exception e) {
|
SpringMVCContextHolder.getSystemLogger().error("关闭OpenOffice服务出错" + e);
|
}
|
}
|
|
/**
|
* 转换pdf
|
* @param input
|
* @param output
|
* @return
|
*/
|
public static File convertToPdf(String input, String output) {
|
File inputFile = null;
|
File outFile = null;
|
OfficeManager officeManager = null;
|
try {
|
SpringMVCContextHolder.getSystemLogger().info("从队列中提取转换端口...");
|
officeManager = officeManagerQueue.take();
|
inputFile = new File(input);
|
outFile = new File(output);
|
SpringMVCContextHolder.getSystemLogger().info("开始转换文档:" + input + "=>" + output);
|
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
|
converter.convert(inputFile, outFile); // 转换文档
|
} catch (Exception e) {
|
e.printStackTrace();
|
SpringMVCContextHolder.getSystemLogger().error("转换文档出错" + e);
|
outFile = null;
|
} finally {
|
SpringMVCContextHolder.getSystemLogger().info("结束转换文档");
|
if (officeManager != null) {
|
try {
|
officeManagerQueue.put(officeManager);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
return outFile;
|
}
|
}
|