我在整个应用程序中有多个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 检查)