DynamicJasper | JasperReports | Проблемы многопоточности изображения баннера

Не уверен, что проблема в DynamicJasper или JasperReport. Я использую эту версию:

 <dependency>
     <groupId>ar.com.fdvs</groupId>
     <artifactId>DynamicJasper</artifactId>
     <version>5.1.0</version>
 </dependency>

Создание динамического отчета следующим образом:

DynamicReportBuilder drb = new DynamicReportBuilder();
        Integer margin = 20;
        drb.setTitleStyle(titleStyle)
                .setTitle(tabularConfig.getTitle())                    //defines the title of the report
                .setSubtitle(tabularConfig.getSubTitle())
                .setDetailHeight(15)
                .setLeftMargin(margin)
                .setRightMargin(margin)
                .setTopMargin(margin)
                .setBottomMargin(margin)
                .setUseFullPageWidth(true)
                .setPrintBackgroundOnOddRows(true)
                .setOddRowBackgroundStyle(oddRowStyle)
                .addFirstPageImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/logo_fdv_solutions_60.jpg", 197, 60, ImageBanner.Alignment.Left)
                .addFirstPageImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 300, 60, ImageBanner.Alignment.Right)
                .addImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/logo_fdv_solutions_60.jpg", 100, 25, ImageBanner.Alignment.Left, ImageScaleMode.FILL)
                .addImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 150, 25, ImageBanner.Alignment.Right, ImageScaleMode.FILL)
                .addFooterImageBanner(System.getProperty("user.dir") + "/target/test-classes/images/dynamicJasper_60.jpg", 150, 25, ImageBanner.Alignment.Right, ImageScaleMode.FILL);

Экспортировать отчет так:

JasperReport jr = DynamicJasperHelper.generateJasperReport(drb.build(), new ClassicLayoutManager(), params);
            JasperPrint jp = JasperFillManager.fillReport(jr, params, new JRBeanCollectionDataSource(pdfGenRequest.getData()));
            JasperExportManager.exportReportToPdfFile(jp, "out_" + pdfGenRequest.getPartitionIndex() + ".pdf");

Я вижу эту ошибку иногда (когда есть несколько потоков, генерирующих отчет).

net.sf.jasperreports.engine.JRException: java.lang.NullPointerException
    at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processImageRetainShape(JRPdfExporter.java:1750)
    at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1607)
    at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1535)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1475)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1093)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1056)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:920)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:537)
    at net.sf.jasperreports.engine.JasperExportManager.exportToPdfFile(JasperExportManager.java:155)
    at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:503)
    at com.cisco.exporter.pdf.JasperPdfGenerator.generatePdf(JasperPdfGenerator.java:98)
    at com.cisco.exporter.pdf.PdfGeneratorVerticle.generatePdf(PdfGeneratorVerticle.java:34)
    at io.vertx.rxjava.core.eventbus.EventBus$3.handle(EventBus.java:241)
    at io.vertx.rxjava.core.eventbus.EventBus$3.handle(EventBus.java:239)
    at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:212)
    at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:191)
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$3(EventBusImpl.java:505)
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:337)
    at io.vertx.core.impl.TaskQueue.lambda$new$0(TaskQueue.java:60)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at java.awt.color.ICC_Profile.activateDeferredProfile(ICC_Profile.java:1090)
    at java.awt.color.ICC_Profile$1.activate(ICC_Profile.java:744)
    at sun.java2d.cmm.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:95)

Но все переменные, показанные в приведенном выше коде, являются локальными (потокобезопасными) переменными. Но внутренне (не уверен, где) что-то не является потокобезопасным. Это всегда работает последовательно с одним потоком. Кроме того, если я удаляю код, связанный с графическим баннером, он работает нормально, даже если он многопоточный. Есть указатели?

0 ответов

Другие вопросы по тегам