Skip to content

Document.convert(OutputStream outputLogStream, PdfFormat format, ConvertErrorAction action) is not thread-safe #64

@vmuth85

Description

@vmuth85

I've got an issue with the Document.convert(OutputStream outputLogStream, PdfFormat format, ConvertErrorAction action) method in a concurrency scenario. Using this method in parallel throws the following exception:

com.aspose.pdf.internal.ms.System.l7k: Only 3D and 4D CLUT are supported
at com.aspose.pdf.internal.l59l.l0t.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l0if.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l1if.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l2if.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l1t.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l1t.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l2h.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l0p.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l0p.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l0p.lI(Unknown Source)
at com.aspose.pdf.internal.foundation.rendering.l3u.lI(Unknown Source)
at com.aspose.pdf.internal.foundation.rendering.l3u.(Unknown Source)
at com.aspose.pdf.internal.l2p.lu.(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
at com.aspose.pdf.internal.l9f.l1n.lI(Unknown Source)
at com.aspose.pdf.internal.l9k.l1t.lf(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.l3n(Unknown Source)
at com.aspose.pdf.internal.l9k.l1t.l5v(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
at com.aspose.pdf.ADocument.lI(Unknown Source)
at com.aspose.pdf.Document.lI(Unknown Source)
at com.aspose.pdf.ADocument.convertInternal(Unknown Source)
at com.aspose.pdf.Document.convertInternal(Unknown Source)
at com.aspose.pdf.ADocument.convert(Unknown Source)
at com.aspose.pdf.Document.convert(Unknown Source)
at de.synaxon.asposetest.AsposeTest.convertPdf(AsposeTest.java:48)
at de.synaxon.asposetest.AsposeTest.lambda$main$0(AsposeTest.java:32)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)

class com.aspose.pdf.internal.l59l.l0k: Exception of type System.Exception was thrown.
com.aspose.pdf.internal.l59l.l1t.ld(Unknown Source)
com.aspose.pdf.internal.l59l.l1t.lI(Unknown Source)
com.aspose.pdf.internal.l59l.l0p.lI(Unknown Source)
com.aspose.pdf.internal.foundation.rendering.l3u.lI(Unknown Source)
com.aspose.pdf.internal.foundation.rendering.l3u.(Unknown Source)
com.aspose.pdf.internal.l2p.lu.(Unknown Source)
com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
com.aspose.pdf.internal.l9f.l1n.lI(Unknown Source)
com.aspose.pdf.internal.l9k.l1t.lf(Unknown Source)
com.aspose.pdf.internal.l9k.l1if.l3n(Unknown Source)
com.aspose.pdf.internal.l9k.l1t.l5v(Unknown Source)
com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
com.aspose.pdf.ADocument.lI(Unknown Source)
com.aspose.pdf.Document.lI(Unknown Source)
com.aspose.pdf.ADocument.convertInternal(Unknown Source)
com.aspose.pdf.Document.convertInternal(Unknown Source)
com.aspose.pdf.ADocument.convert(Unknown Source)
com.aspose.pdf.Document.convert(Unknown Source)
de.synaxon.asposetest.AsposeTest.convertPdf(AsposeTest.java:48)
de.synaxon.asposetest.AsposeTest.lambda$main$0(AsposeTest.java:32)
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base/java.lang.Thread.run(Thread.java:833)
at com.aspose.pdf.internal.l59l.l1t.ld(Unknown Source)
at com.aspose.pdf.internal.l59l.l1t.lI(Unknown Source)
at com.aspose.pdf.internal.l59l.l0p.lI(Unknown Source)
at com.aspose.pdf.internal.foundation.rendering.l3u.lI(Unknown Source)
at com.aspose.pdf.internal.foundation.rendering.l3u.(Unknown Source)
at com.aspose.pdf.internal.l2p.lu.(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
at com.aspose.pdf.internal.l9f.l1n.lI(Unknown Source)
at com.aspose.pdf.internal.l9k.l1t.lf(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.l3n(Unknown Source)
at com.aspose.pdf.internal.l9k.l1t.l5v(Unknown Source)
at com.aspose.pdf.internal.l9k.l1if.lI(Unknown Source)
at com.aspose.pdf.ADocument.lI(Unknown Source)
at com.aspose.pdf.Document.lI(Unknown Source)
at com.aspose.pdf.ADocument.convertInternal(Unknown Source)
at com.aspose.pdf.Document.convertInternal(Unknown Source)
at com.aspose.pdf.ADocument.convert(Unknown Source)
at com.aspose.pdf.Document.convert(Unknown Source)
at de.synaxon.asposetest.AsposeTest.convertPdf(AsposeTest.java:48)
at de.synaxon.asposetest.AsposeTest.lambda$main$0(AsposeTest.java:32)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)

Use the following code to reproduce the error:

public class AsposeTest {

    private static final String PDF_PATH = "/opt/data/testme.pdf";
    private static final Object asposePdfLock = new Object();

    public static void main(String[] args) throws IOException, InterruptedException {
        int numberOfThreads = 100;
        ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);

        for (int i = 0; i < numberOfThreads; i++) {
            executorService.submit(() -> {
                try {
                    convertPdf();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            });
        }

        executorService.shutdown();
    }

    private static void convertPdf() throws IOException {
        try (InputStream inputStream = new FileInputStream(PDF_PATH); ByteArrayOutputStream a3bOut = new ByteArrayOutputStream()) {
//            synchronized (asposePdfLock) {
                // Convert and save directly to the output stream
                try (Document document = new Document(inputStream)) {
                    document.convert(a3bOut, PdfFormat.PDF_A_3B, ConvertErrorAction.None);
                    document.save(a3bOut);
                    document.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
//            }
            System.err.println("Done with conversion!");
        }

    }

}

Using a synchronized block fixes the behaviour but it is not an option as there is no longer any throughput.

Tested with aspose-pdf 25.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions