jodconvert與MQ構(gòu)建異步處理文檔的demo

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原創(chuàng)者:文思

閑話少說,直接上干貨。

應(yīng)用背景:

針對(duì)一些有價(jià)值文檔的處理使用,怎么保護(hù)內(nèi)容不被盜用與擴(kuò)散,是互聯(lián)網(wǎng)應(yīng)用中常遇到的一種情景,一般兩種思路:

1、服務(wù)器端進(jìn)行加密,然后客戶端本地解密或者調(diào)用服務(wù)器進(jìn)行解密后再瀏覽或者下載。

? ? ? 缺點(diǎn):在線加解密效率低,有延時(shí),無法解決客戶端人為錄屏獲取資料的行為。

2、將文檔轉(zhuǎn)換成pdf并且加載產(chǎn)權(quán)水印,用戶在線預(yù)覽不允許下載??梢员苊庠诰€解密的效率問題與客戶端錄屏問題。

一、各種文檔轉(zhuǎn)換成pdf的工具選擇:

jacob與jodconvert

前者只支持windows環(huán)境下word,ppt,excel,txt等文件的pdf轉(zhuǎn)換

后者windows和linux都支持。

從在windows上的執(zhí)行效率上來說,jacob略高于jodconvert。

二、使用jacob的demo

1、設(shè)置處理線程隊(duì)列及數(shù)量,根據(jù)文檔類型跳轉(zhuǎn)到不同轉(zhuǎn)換方法中

文檔轉(zhuǎn)換工具類,wordQueue為文檔的服務(wù)線程處理調(diào)度器隊(duì)列,根據(jù)需求的應(yīng)用場景有可能的并發(fā)性來設(shè)置大小,與MQ機(jī)制類似。WORDSIZE為設(shè)置的文檔處理最大線程數(shù)量,即wordQueue的容量,當(dāng)一個(gè)請(qǐng)求來到時(shí),wordQueue中處理線程為空時(shí),進(jìn)行創(chuàng)建服務(wù)處理線程調(diào)度器,并放入到wordQueue隊(duì)列中。

2、具體的文檔轉(zhuǎn)換pdf的處理方法,兩大步:2.1獲取處理調(diào)度器getWordDoc(), 2.2處理文檔開始Dispatch.call(...)

2.1

紅色部分是2.1

其中獲取調(diào)度器getWordDoc分兩步:1startAllWord創(chuàng)建調(diào)度器并加入隊(duì)列中,2隊(duì)列中取第一個(gè)調(diào)度器,如下兩個(gè)圖:

調(diào)用調(diào)度創(chuàng)建方法后并取隊(duì)列中第一個(gè)調(diào)度

startAllWord()創(chuàng)建好3個(gè)處理調(diào)度并放入wordQueue隊(duì)列后,將從wordQueue中取第一個(gè)處理調(diào)度。其中創(chuàng)建調(diào)度的startAllWord()程序如下:

只創(chuàng)建3個(gè)調(diào)度并加入的隊(duì)列

總結(jié)描述:如果服務(wù)線程調(diào)度程序在隊(duì)列中沒有,最上面已經(jīng)把隊(duì)列容量調(diào)度器線程設(shè)置為了3,則創(chuàng)建3個(gè)處理調(diào)度器并加入到隊(duì)列中,并wordQueue.poll()獲取并移除此隊(duì)列的頭(即拿到隊(duì)列中的第一個(gè)調(diào)度器)。

2.2

紅色部分是2.2

三、使用jodconvert的demo

大戲開始:

convert2.2(com)與3.1(org)版本的比較:

通過上面的對(duì)比,除了org支持更多格式之外在速度上沒有優(yōu)勢(shì),并且轉(zhuǎn)換出來的文字清晰度比com低了一點(diǎn)點(diǎn)。還有org即3.1版本吧支持office2007,而2.1comg只支持到2003.具體看兩個(gè)版本的DefaultDocumentFormatRegistry類的源碼。

代碼編寫:

3.1mq消息獲取,調(diào)用文檔轉(zhuǎn)換前的消息業(yè)務(wù)處理:

接收到外部微服務(wù)mq文檔轉(zhuǎn)換請(qǐng)求的消息并調(diào)用文檔轉(zhuǎn)換的前置方法ms2pdfByQueueExternalUtil

3.2獲取文件,并進(jìn)行文檔轉(zhuǎn)換:

#oss配置

oss.accessKeyId=********

oss.secretAccessKey=********

oss.endpoint=********

oss.bucketName=pbu-private

3.3編寫獲取文檔處理轉(zhuǎn)換器的連接池文件OfficeDocumentConverter converter = OpenOfficePool.getConvertSingle();

以上是啟動(dòng)1個(gè)端口1個(gè)openoffice服務(wù)。以下是啟動(dòng)多個(gè)端口多個(gè)openoffice服務(wù),建議使用以下:


設(shè)置全局OfficeManager,如果為空,則啟動(dòng)openoffice程序并新建返回一個(gè)OfficeManager。

startAll:啟動(dòng)openoffice程序并新建返回一個(gè)OfficeManager

getConvert:調(diào)用者

---------------------------------------------------------

openoffice配置:

#openOffice信息

office.service=http://10.10.16.146

#office.home=D:\\OpenOffice 4\\OpenOffice 4\\

office.home=/opt/openoffice4/

#起始端口

office.port=8100

#端口啟動(dòng)增量

office.portsize=10

#失敗補(bǔ)償次數(shù)

office.converttimes=3

3.4通過其它外部微服務(wù)接口調(diào)用回寫轉(zhuǎn)換后的結(jié)果給消息發(fā)送方:

以上是程序部分,以下是發(fā)布過程中遇到的小坑及填坑:

程序無法啟動(dòng)openoffice服務(wù)

使用jodconverter-core將文檔轉(zhuǎn)pdf還需要commons-io包

根據(jù)其它錯(cuò)誤提示發(fā)現(xiàn)百度:http://blog.csdn.net/zhizaibide1987/article/details/30035723

還需要juh、jurt、unoil、ridl這4個(gè)包。添加后然后程序仍然無法啟動(dòng)office后,嘗試手工在服務(wù)器上啟動(dòng):

報(bào): no suitable windowing system found, exiting.錯(cuò)誤.

百度:http://blog.csdn.net/cuker919/article/details/46389449

安裝X Window System:yum groupinstall "X Window System"

安裝成功后啟動(dòng)

啟動(dòng)成功。關(guān)閉此進(jìn)程后程序調(diào)用啟動(dòng)并轉(zhuǎn)pdf成功

注意一點(diǎn):使用boot的MQ接收處理時(shí),一定要捕獲異常且將當(dāng)前mq消息,變自動(dòng)應(yīng)答為手工(即程序處理干預(yù))應(yīng)答,且放在消息隊(duì)列的最后面,否則對(duì)消息的業(yè)務(wù)處理失敗后mq的機(jī)制會(huì)重新拿起這條消息放到隊(duì)列的最前面再次執(zhí)行,這樣就形成了:隊(duì)列第一條消息執(zhí)行-->業(yè)務(wù)處理失敗-->放到消息隊(duì)列最前面第一條-->再執(zhí)行-->再失敗-->再放到隊(duì)列最前面第一條里,這樣無限下去死循環(huán),從而引發(fā)消息阻塞,業(yè)務(wù)中斷,所以大家一定要注意,才catch中捕獲異常并放在消息隊(duì)列的最后面,具體

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,836評(píng)論 6 427
  • 寶齋寺住持:姑娘,你有佛緣。 淺笑:佛有緣于我,我無緣于佛。塵世的七情,已絆我太深。 住持:放下吧!孽緣,注定無果...
    布丁小小鬼閱讀 270評(píng)論 0 0
  • 今天終于回北京了。剛下高鐵、手機(jī)就響了,要約朕吃飯。朕雖甚表心慰??蓪?shí)屬無奈于體弱、便此推之。怎奈、歸家途中、朕被...
    愛吃糖的艾糖閱讀 147評(píng)論 0 0
  • 腦海中的畫面并不清晰,只記得我和朋友曉雯匆忙走在路上,趕著去上課。拐角處突然看到了熟悉的身影,走近一看,竟然是許久...
    這里楓菲閱讀 380評(píng)論 2 5

友情鏈接更多精彩內(nèi)容