我一直在开发一个使用Jasper Library(6.3.0)的JAVA应用程序。该系统在solaris盒上运行多线程。在大多数情况下,整个过程运行良好,我们动态创建xml以用作数据源,因为我们需要调用许多不同的服务来构建我们的内容。
但是,我不知道Stack Overflow可以在这里提供多少帮助,我们遇到了一个非常令人担忧的错误/问题。在大约100个报告中的1个中,我们遇到了奇怪的格式问题,其中文本变得随机粗体,更大,从页面的那边掉下来。重新运行任何有问题的'报告证明它没有个人报告,因为第二次运行会很好。
我已经在创建时输出了XML,并确认内容看起来是正确的,没有随机格式问题或类似的东西。所以问题出现在填充点上。我有一些预感,这可能是我们使用Jasper的Api同时具有多线程(与性能相关)或与字体有关的方式。但是,如果它是其中任何一个,我希望问题更频繁和一致地出现,但它是随机的。
我一直在试图识别和排除不同的场景 - 我唯一剩下的选择似乎是动态地构建一些内容并使用不同的方法来报告构建。我理解这是一个非常困难的事情来帮助调试或询问,因为它有点随机性。我如何工作我首先确定报告首次以这种方式被窃听?我如何确定路线原因?
添加了代码,因为人们要求的东西:
//generate the document with jasper
Document document;
try {
document = JRXmlUtils.parse(new InputSource(new StringReader(xml)));
} catch (JRException e) {
logger.error("Parsing XML has failed, report no:" + id + " " + e.getMessage());
e.printStackTrace();
}
// Passing parameters
Map<String, Object> parameters = new HashMap<>();
parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);
//put the chosen template ids as parameters
parameters.put("template1", template1.toString());
parameters.put("template2", template2.toString());
parameters.put("template3", template3.toString());
logger.info("Creating report object...");
JRPdfExporter jrPdfExporter = new JRPdfExporter();
JasperPrint jprint;
try {
jprint = JasperFillManager.fillReport("resources/report_source/REPORT.jasper", parameters);
} catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
}
答案 0 :(得分:0)
我会回答我自己的问题。
我认为我的问题没有提到哪个实际上非常重要的是我们在所有报告中都使用了HTML组件,并且在HTML内容中进一步调查它&#39 ;随机&#39;在多线程中进行格式化。
JASPER论坛在这个主题上并不精彩,除了HTML组件没有准备好生产 - 但是在深入研究HTML组件代码之后,我现在知道它是如何工作的。 HTML组件使用另一个库将HTML转换为图像,确切地说是SVG。然后它使用它来构建html内容。它使用的图书馆是Flying Saucer,它看起来很受欢迎,看起来像是他们的github,但他们确实提到它是一种单线程类型的东西 - 这意味着它的HTML组件Jasper不是线程安全的。
我们已经提出了两种可能的解决方案,我们在多线程应用程序之外单独使用Flying Saucer来构建SVG的HTML部分,然后使用Jasper&# 39; s用于导入已完成图像的Image对象。要么;完全删除所有HTML元素,并使用非常非常基本的html标记Jasper文本对象。
我希望这可以帮助其他任何人遇到Jasper和HTML组件!