Openoffice+pdf 2 swfオンライン変換officeドキュメントを実現し、オンラインプレビューを実現

5961 ワード

キュー+マルチスレッドによるドキュメントのオンライン変換:
アイデア:なぜキュー+スレッドを使うのか、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