[
https://issues.apache.org/jira/browse/PDFBOX-3689?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ryan Kimber closed PDFBOX-3689.
-------------------------------
Resolution: Not A Problem
My mistake - our CI Pipeline was not devoting enough memory to the container
for our PDF services. The container was therefore running out of memory when it
hit renderImageWithDPI and was not logging any errors. Supervisor was
re-instating the process though, and the messages were still checked out of the
queue - so it looks like a hang.
> PDFBox Hanging when Rendering PDF
> ---------------------------------
>
> Key: PDFBOX-3689
> URL: https://issues.apache.org/jira/browse/PDFBOX-3689
> Project: PDFBox
> Issue Type: Bug
> Affects Versions: 2.0.4
> Reporter: Ryan Kimber
> Attachments: troubled-pdf.pdf
>
>
> I'm trying to render the attached file in a Docker container, using the
> oracle-java-8 image, rendering pages with {{PDFRenderer.renderImageWithDPI}}
> is hanging indefinitely (or at least, for a very long time).
> I'm experiencing the same symptoms as PDFBOX-3562, where the call to
> renderImageWithDPI never returns, and likewise, I'm using the java startup
> parameter: {{-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider}}.
> We are executing the renderImageWithDPI asynchronously using Callables and a
> newWorkStealingPool Executor, with a thread count equal to the number of
> processors + 1.
> Interestingly, when this code and this PDF run in the debugger on my Mac,
> there's no problem.
> This is the code, which runs fine when only one thread is created. Note that
> our code is called when a message is received, but this could easily be a
> main method instead:
> {code:java}
> public class NewPdfTemplateQueueWorker
> {
> private ExecutorService executor =
> Executors.newWorkStealingPool(threadCt);
> private Scheduler scheduler = Schedulers.from(executor);
> @Override
> public void processRequest(BuildResourceRequest serviceRequest) throws
> PdfServiceException
> {
> //We're going to expect just one action.
> GenerateImagesAndMetaDataStep buildStep =
> (GenerateImagesAndMetaDataStep) serviceRequest.getBuildSteps().get(0);
> buildStep.setRequestId(serviceRequest.getRequestId());
> buildStep.setSessionId(serviceRequest.getSessionId());
> long stopwatch = System.currentTimeMillis();
> try {
> byte[] pdfBytes = buildStep.getPdfBytes();
> PdfInfo pdfInfo = PdfMetaDataFactory.buildPdfInfo(pdfBytes);
> log.warn("it took until " + (System.currentTimeMillis() -
> stopwatch) + "ms to build the pdf info");
> //Generate and publish each page image and thumbnails...
> ArrayList<Callable<Throwable>> callList = new
> ArrayList<Callable<Throwable>>();
> callList.add(new CallablePdfInfoPersister(serviceRequest,
> buildStep, pdfInfo));
> PageImageFactory imageFactory = new PageImageFactory(pdfBytes);
> for(int i = 0; i < pdfInfo.getNumberOfPages(); i++)
> {
> log.info("Adding callablePageImageGenerator for page #"+ (i +
> 1) + "...");
> callList.add(new CallablePageImageGenerator(buildStep,
> imageFactory, i));
> }
> boolean allSucceeded = true;
> Throwable firstError = null;
> List<Future<Throwable>> results = executor.invokeAll(callList);
> for(Future<Throwable> result : results) {
> if(result.get() != null) {
> allSucceeded = false;
> firstError = result.get();
> break;
> }
> }
> if(allSucceeded) log.warn("We have created the page images and
> PDF Info and written them to Google Storage");
> else throw new PdfServiceException("Error generating at least one
> page image", firstError);
> }
> catch(PdfServiceException pdfse)
> {
> log.error("PDFServiceException while processing request:", pdfse);
> tryToRespondWithError(serviceRequest, pdfse);
> }
> catch(IOException | InterruptedException | ExecutionException fce) {
> log.error(fce.getClass().getName() + " while processing
> request:", fce);
> throw new PdfServiceException("Unable to process new PDF template
> due to exception:", fce);
> }
> finally {
> stopwatch = System.currentTimeMillis() - stopwatch;
> log.warn("It took " + stopwatch + "ms to convert the PDF to data
> and images...");
> }
> }
> }
> public class CallablePageImageGenerator implements Callable<Throwable>
> {
> private static final Logger log =
> LogManager.getLogger(CallablePageImageGenerator.class.getName());
> private GenerateImagesAndMetaDataStep buildStep;
> private PageImageFactory pageImageFactory;
> private int pageIndex;
> public CallablePageImageGenerator(GenerateImagesAndMetaDataStep
> buildStep, PageImageFactory pageImageFactory, int pageIndex)
> {
> super();
> this.buildStep = buildStep;
> this.pageImageFactory = pageImageFactory;
> this.pageIndex = pageIndex;
> }
> public Throwable call() {
> try {
> long pageTime = System.currentTimeMillis();
> //This pageImageFactory.convertToPageImage function calls
> pdfRenderer.renderImageWithDPI(pdPage, 150)...
> PageImage pageImage =
> pageImageFactory.convertPageToImage(pageIndex, 150);
> log.warn("Page " + (pageIndex + 1) + " Images took " +
> (System.currentTimeMillis() - pageTime) + "ms to generate...");
> //publisher.publishMessage(RESPONSE_QUEUE, new
> PageImageResult("pageImageResult", serviceRequest.getRequestId(),
> serviceRequest.getSessionId(), pageImage));
> //Write to Google Cloud Storage, but don't bother writing
> anywhere else
>
> //CachingGoogleCloudStorageUtil.putPageImage(buildStep.getBucket(),
> buildStep.getFileFolder(), pageImage);
> log.warn("Page " + (pageIndex + 1) + " complete in " +
> (System.currentTimeMillis() - pageTime) + "ms");
> return null;
> }
> catch(IOException ioe)
> {
> log.error("IOException generating images for page " + (pageIndex
> + 1), ioe);
> return ioe;
> }
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]