利用队列+多线程实现文档在线转换:
主意:为什么要用 队列+线程 ,因为openoffice的转换任务,如果文档过大,多次调用转换就会卡掉,再次利用队列,在转换的过程中其他转换任务处于队列的等待状态,只有转换成功后再调用下个转换任务
第一步:创建一个线程池,(上篇博客有写)
package com.cloud.job;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @ClassName: ThreadPool
* @author caixl
* @date 2016-6-3 下午4:50:00
*
*/
public class ThreadPool {
private static ExecutorService threadPool = null;
public static ExecutorService getThreadPool(){
if(threadPool==null){
threadPool = Executors.newCachedThreadPool();
}
return threadPool;
}
}
package com.cloud.job;
import java.util.concurrent.LinkedBlockingQueue;
/**
*
* @ClassName: TaskQueue
* @author caixl
* @date 2016-6-3 下午4:49:50
*
*/
public class TaskQueue {
private static LinkedBlockingQueue queues = null;
public static LinkedBlockingQueue getTaskQueue(){
if(queues==null){
queues = new LinkedBlockingQueue();
System.out.println("初始化 队列");
}
return queues;
}
public static void add(Object obj){
if(queues==null)
queues = getTaskQueue();
if(!queues.contains(obj))
queues.offer(obj);
System.out.println("-------------------------------");
System.out.println("入队:"+obj);
}
}
第三步:创建一个入队的线程,专门负责往队列中加入元素
package com.cloud.job;
/**
*
* @ClassName: Produce
* @author caixl
* @date 2016-6-3 下午4:49:41
*
*/
public class Produce implements Runnable {
private static volatile boolean isRunning=true;
private static volatile Object obj;
public Produce(Object obj){
this.obj = obj;
}
public void run() {
TaskQueue.add(obj);
}
}
package com.cloud.job;
import org.apache.log4j.Logger;
import com.cloud.platform.DocConstants;
/**
*
* @ClassName: Consumer
* @author caixl
* @date 2016-6-3 下午4:48:46
*
*/
public class Consumer implements Runnable {
private static Consumer consumer;
private static Logger logger = Logger.getLogger(Consumer.class);
public static volatile boolean isRunning=true;
public void run() {
while(isRunning)
{
isRunning = false;
DocCovertThread docCovertThread = new DocCovertThread();
docCovertThread.run();
}
}
public static Consumer getInstance(){
if(consumer==null){
consumer = new Consumer();
System.out.println("初始化消费线程");
logger.info("初始化消费线程");
}
return consumer;
}
}
第五步:创建一个转换文档的线程
package com.cloud.job;
import java.io.File;
import java.util.Map;
import org.apache.log4j.Logger;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.document.DefaultDocumentFormatRegistry;
import org.artofsolving.jodconverter.document.DocumentFormat;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
import org.quartz.JobExecutionContext;
import com.cloud.doc.convert.pdf2swf;
import com.cloud.platform.DocConstants;
import com.database.bean.MainTableAttachFile;
/**
*
* @ClassName: DocCovertThread
* @author caixl
* @date 2016-6-3 下午4:49:15
*
*/
public class DocCovertThread implements Runnable{
private static Logger logger = Logger.getLogger(DocCovertThread.class);
/**
* openoffice的安装路径
*/
public static final String OPENOFFICE_HOME = DocConstants.ROOTPATH + "include/OpenOffice";
@Override
public void run() {
try {
JobExecutionContext context = (JobExecutionContext)TaskQueue.getTaskQueue().take();
System.out.println("出队"+context);
Map data = context.getJobDetail().getJobDataMap();
MainTableAttachFile attach = (MainTableAttachFile)data.get("attach");
if (attach == null) {
return;
}
if (DocConstants.isOffice(com.common.StringHelper.getFileExt(attach.getAttachFileName())))
{
System.out.println("开始转换文件"+OPENOFFICE_HOME+" " +attach.getPath());
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
config.setOfficeHome(OPENOFFICE_HOME);
OfficeManager officeManager = config.buildOfficeManager();
try
{
officeManager.start();
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
DocumentFormat outputFormat = new DefaultDocumentFormatRegistry().getFormatByExtension("pdf");
String srcPath = attach.getPath();
String destPath = com.common.StringHelper.getFileName(srcPath) + ".pdf";
converter.convert(new File(srcPath), new File(destPath), outputFormat);
String docPath = com.common.StringHelper.getFileName(attach.getPath());
pdf2swf swfConverter = pdf2swf.getInstance();
swfConverter.convert(docPath, "");
}
catch (Exception e)
{
e.printStackTrace();
logger.error("***** 异常信息 ***** 方法:switchDocToSwf at switch office to pdf", e); return;
}
finally
{
officeManager.stop();
Consumer.isRunning=true;
}
System.out.println("转换结束");
}
} catch (InterruptedException e) {
e.printStackTrace();
Consumer.isRunning=true;
logger.error("***** 异常信息 ***** 方法:DocConvertJob execute", e);
}
}
}
ExecutorService threadPool = ThreadPool.getThreadPool();
Produce consumer2 = new Produce(context);
threadPool.execute(consumer2);
Consumer consumer=Consumer.getInstance();
threadPool.execute(consumer);