Openoffice+pdf 2 swfオンライン変換officeドキュメントを実現し、オンラインプレビューを実現
5961 ワード
キュー+マルチスレッドによるドキュメントのオンライン変換:
アイデア:なぜキュー+スレッドを使うのか、openofficeの変換タスクは、ドキュメントが大きすぎると、複数回呼び出した変換が詰まってしまい、キューを再利用し、変換中に他の変換タスクがキューの待機状態にあり、変換に成功した後に次の変換タスクを呼び出すしかないからです.
ステップ1:スレッドプールを作成します(前のブログに書いてあります)
ステップ2:無境界キューを作成する(前のブログに書いてある)
ステップ4:消費スレッドを作成します.セカンダリスレッドは主にブロックの役割を果たします.つまり、タスクの変換タスクが完了したかどうか、次の変換を呼び出した場合
ステップ6:ドキュメントの変換が必要なときに呼び出す
ソースの詳細は次のとおりです.https://github.com/izhbg/typz
アイデア:なぜキュー+スレッドを使うのか、openofficeの変換タスクは、ドキュメントが大きすぎると、複数回呼び出した変換が詰まってしまい、キューを再利用し、変換中に他の変換タスクがキューの待機状態にあり、変換に成功した後に次の変換タスクを呼び出すしかないからです.
ステップ1:スレッドプールを作成します(前のブログに書いてあります)
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;
}
}
ステップ2:無境界キューを作成する(前のブログに書いてある)
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);
}
}
ステップ3:キューに要素を追加するためのエンキュースレッドを作成します.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);
}
}
ステップ4:消費スレッドを作成します.セカンダリスレッドは主にブロックの役割を果たします.つまり、タスクの変換タスクが完了したかどうか、次の変換を呼び出した場合
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;
}
}
手順5:ドキュメントを変換するスレッドを作成する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);
}
}
}
ステップ6:ドキュメントの変換が必要なときに呼び出す
ExecutorService threadPool = ThreadPool.getThreadPool();
Produce consumer2 = new Produce(context);
threadPool.execute(consumer2);
Consumer consumer=Consumer.getInstance();
threadPool.execute(consumer);
ソースの詳細は次のとおりです.https://github.com/izhbg/typz