Jasper 图书馆 - 随机填写报告 'bug'

Jasper Library - Filling Report Random 'bug'

我一直在开发 JAVA 使用 Jasper 库 (6.3.0) 的应用程序。该系统在 solaris 机器上是多线程的 运行ning。在大多数情况下,整个过程运行良好,我们即时创建 xml 用作数据源,因为我们需要调用许多不同的服务来构建我们的内容。

但是,我不知道 Stack Overflow 能在这里提供多少帮助,我们已经 运行 进入了一个 bug/issue,这非常令人担忧。在 100 份左右的报告中,有 1 份报告会遇到奇怪的格式问题,其中文本随机变为粗体、变大、从页面的一侧掉落之类的东西。重新 运行 任何 'bugged' 报告证明它不在那个单独的报告中,因为第二个 运行 没问题。

我在创建时输出了 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();
    }

我会回答我自己的问题。

我认为我的问题没有提到的实际上非常重要的是我们在所有报告中都使用了 HTML 组件,并且在进一步调查时它就在 HTML 内容中'random' 格式化发生在多线程期间。

JASPER 论坛在这个主题上并不出色,除了 HTML 组件尚未准备好生产 - 但是在进一步挖掘 HTML 组件代码后,我现在知道它是如何工作的. HTML 组件正在使用另一个库将 HTML 转换为图像,准确地说是 SVG。然后它使用它来构建 html 内容。它使用的库是 Flying Saucer,从他们的 github 来看它似乎相当受欢迎,但他们确实提到它是一种单线程类型的东西——这意味着 HTML 组件Jasper 不是线程安全的。

我们提出了两种可能的解决方案,我们正在考虑在多线程应用程序之外单独使用 Flying Saucer 将 HTML 部分构建到 SVG 中,然后使用 Jasper 的 Image 对象来导入完成的图像。要么;完全删除所有 HTML 元素并使用非常 非常 基本 html 标记 Jasper 文本对象。

我希望这对遇到 Jasper 和 HTML 组件的其他人有所帮助!