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