Спасибо Бастиан . Я нашел другой способ, основываясь на ответе Бастиана. Открытие нескольких портов обеспечивает доступ к созданию многопоточности. Но без многих портов (достаточно нескольких) мы можем улучшить производительность, увеличив task queue timeout
, вот документация . И еще раз, мы решили не start
и stop
officeManager
на каждом процессе преобразования. В конце концов, я решил эту задачу следующим способом:
public class JODConverter {
private static volatile OfficeManager officeManager;
private static volatile OfficeDocumentConverter converter;
public static void startOfficeManager(){
try {
officeManager = new DefaultOfficeManagerConfiguration()
.setOfficeHome(new File('libre office home path'))
.setPortNumbers(8100, 8101, 8102, 8103, 8104 )
.setTaskExecutionTimeout(600000L) // for big files
.setTaskQueueTimeout(200000L) // wait if all port were busy
.buildOfficeManager();
officeManager.start();
// 2) Create JODConverter converter
converter = new OfficeDocumentConverter(officeManager);
} catch (Throwable e){
e.printStackTrace();
}
}
public static void convertPDF(File inputFile, File outputFile) throws Throwable {
converter.convert(inputFile, outputFile);
}
public static void stopOfficeManager(){
officeManager.stop();
}
}
Я звоню JODConverter
convertPDF
, когда необходимо преобразование. Он будет остановлен только тогда, когда приложение не работает.