DynamicJasper | JasperReports |横幅图像多线程问题

时间:2017-05-09 09:11:33

标签: java multithreading jasper-reports awt dynamic-jasper

不确定问题出在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 个答案:

没有答案