6

我在整个应用程序中有多个Jasper 报告(带有子报告)。出于某种原因,一份报告(也包含子报告)不再起作用。调试了1天多,发现进入死循环,不断创建线程进行子报表填充。

调试器不断循环:

JRSubReportRunnable.java

public void run()
{
    running = true;     
    error = null;

    try
    {
        fillSubreport.fillSubreport();
    }
    catch (JRFillInterruptedException e)
    {
        //If the subreport filler was interrupted, we should remain silent
    }
    // we have to catch Throwable, because it is difficult to say what would happen with the master
    // filler thread in case we don't
    catch (Throwable t) //NOPMD
    {
        error = t;
    }

    running = false;
}

上述方法启动一个线程以填充子报告。完成后,设置running = false和调试器可以:

JRThreadSubreportRunner.java

public void run()
{
    super.run();

    if (log.isDebugEnabled())
    {
        log.debug("Fill " + subreportFiller.fillerId + ": notifying of completion");
    }

    synchronized (subreportFiller)
    {
        //main filler notified that the subreport has finished
        subreportFiller.notifyAll();
    }
}

一旦线程完成,它就会到达上面的方法subreportFiller.notifyAll();行。然后,调试器返回到JRSubreportRunnable.java,依此类推。

从理论上讲,如果我有 5 个子报告,它应该创建 5 个线程(适用于其他报告)。不幸的是,对于这种情况,它不断创建线程,并且我的调试器在上述两种方法之间“卡住”(仅供参考:这些类来自jasperreports-3.7.6-sources.jar)。

也试过:

我发现了一个类似的 StackOverflow 问题,但那里提出的答案对我不起作用。JasperSoft Community 上的这个线程中提出的任何解决方案也没有。

我真的不明白为什么会出现这个问题。我敢肯定这是一件小事,因为它曾经工作过。希望其他人偶然发现了这一点并可能有解决方案。提前感谢您的任何回答。(我知道我没有提供关于我的子报告内容的真正信息,但它非常私密;不过,我可以向您保证,报告和相关子报告的内容没有改变 - 用 Git 检查)

4

1 回答 1

6

我遇到了完全相同的问题,并通过将我的子报告的 isPrintWhenDetailOverflows 属性从 true 更改为 false 来解决它,如下所示:http: //community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill

希望能帮助到你

于 2012-11-14T14:09:09.163 回答