2016-04-26 90 views
3

我使用documents4j庫編寫了一些代碼,將.docx中的一些文檔轉換爲.pdf如何管理LocalConverter並調用ShutDown()方法?

我遵循文檔中的例子和轉換完美使用MS-Word,但我注意到,所有轉換完成和方法返回後,Java應用程序結果仍在運行,它似乎不會退出。

如果我明確地關閉使用​​和shutDown()方法,而不是schedule(),應用程序退出的轉換器,但我需要在並行模式下,該應用程序運行,所以我不能顯式調用shutDown()否則我會MS-Word中退出和休息有些仍然打開文件。

使用轉換器實現這些目標的最佳方法是什麼?有LocalConverter得到一個方法來檢查是否有一個文件隊列被轉換?有了這些信息,我只能用空隊列調用shutDown(),並在下一個轉換請求中實例化一個新的LocalConverter。

在此先感謝您的答覆!

回答

1

我是documents4j的維護者。

您是對的,LocalConverter當前並未等待運行轉換關閉時終止。我添加了一個寬限期,該期限對應於運行轉換完成的超時時間,將包含在document4j的下一個版本中。一旦我查看了包含空格的文件夾中的轉義路徑的掛起問題,我將發佈一個新版本。

同時,我建議你自己實現一些類似的東西。每次轉換都會生成Future。簡單地收集Set中的所有期貨,然後在線索的每個未來中調用get。如果所有期貨已經返回(即所有轉換完成)​​,它是安全的關閉本地轉換器:

IConverter converter = ...; 
Set<Future<?>> futures = new HashSet<>(); 
for (...) { 
    futures.add(converter.from(...).to(...).schedule()); 
} 
for (Future<?> future : futures) { 
    future.get(); 
} 
converter.shutDown(); 

以上是安全的,因爲所有的轉換都是同時進行,但主線程阻塞,直到所有的期貨已完成。 Future::get阻止,直到其轉換完成,但是如果轉換已經完成,則立即返回。在完成所有轉換之前,請確保您未達到shutDown

+0

嗨拉斐爾,非常感謝您的快速回復。那麼你是否建議在schedule()方法返回的Set of Future上使用類似信號量的東西?根據你的建議,我將不得不在該套件上使用一些同步機制。我對嗎?你認爲你可以分享document4j的下一個版本嗎? –

+0

我目前很忙,因爲我很快就要休假,但今年夏天有一段時間。但是它不應該做太多的工作,我會添加一個小代碼示例 –