Как я могу использовать Executor Service с Callables для создания PDF из списка HTML за меньшее время? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть список HTML размером 10. Некоторые HTML содержат SVG-контент. Я пытаюсь сгенерировать PDF, объединив все HTML-файлы с помощью iText 7.

Когда я пытаюсь выполнить последовательное / нормальное выполнение, генерация PDF занимает около 1 минуты 30 секунд, поскольку содержимое SVG находится в процессе. обрабатывается с использованием Apache Batik отдельно для преобразования в PDF, а затем объединяется с его отдельным родительским PDF.

Позже я попытался использовать многопоточный подход с использованием службы executor с функцией callable, но производительность не улучшилась, поскольку для создания PDF-файла также требуется около 1 минуты 30 секунд. Ниже приведен код. Может кто-нибудь, пожалуйста, дайте мне знать, правильно ли я использую многопоточность?

//List<HtmlTemplateBean> htmlSources is the input

List<ByteArrayOutputStream> pdfDocumentList= new ArrayList<ByteArrayOutputStream>();
List<Future<ByteArrayOutputStream>> futureList= new ArrayList<Future<ByteArrayOutputStream>>();
ExecutorService executorService = Executors.newFixedThreadPool(htmlSources.size());
Vector<Callable<ByteArrayOutputStream>> callables = new Vector<Callable<ByteArrayOutputStream>>();
for (HtmlTemplateBean htmlTemplateBean : htmlSources) {                 
    callables.add(new PDFGenerator(htmlTemplateBean,userData,headerData,baseUri,tokenName,tokenValue));                                 
}
try {
    futureList = executorService.invokeAll(callables);
} catch (InterruptedException e1) {                 
    e1.printStackTrace();
}               
for(Future<ByteArrayOutputStream> future : futureList){
    ByteArrayOutputStream bytesData = null;
    try {
        try {
            bytesData = future.get(60,TimeUnit.SECONDS);
        } catch (TimeoutException e) {
            LOGGER.error("TimeoutException : " , e.getMessage());
            e.printStackTrace();
        }
        System.out.println("Task Done : " + future.isDone());
    } catch (InterruptedException | ExecutionException e) {
        LOGGER.error("InterruptedException | ExecutionException : " , e.getMessage());
        e.printStackTrace();
    }
    pdfDocumentList.add(bytesData);
}
executorService.shutdown();

//pdfDocumentList will be used to generate the Merged PDF
...