アプリケーション全体に複数のJasperレポート(サブレポート付き)があります。何らかの理由で、1つのレポート(サブレポートも含まれています)が機能しなくなりました。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つのスレッドを作成する必要があります(他のレポートでも機能します)。残念ながら、この場合、スレッドを作成し続け、私のデバッガーは上記の2つのメソッドの間で「スタック」します(参考:クラスはjasperreports-3.7.6-sources.jarからのものです)。
また試した:
同様のStackOverflowの質問を見つけましたが、そこで提案された回答はうまくいきませんでした。JasperSoftコミュニティのこのスレッドから提案されたソリューションもありませんでした。
この問題が発生する理由がよくわかりません。以前は機能していたので、マイナーなものだと確信しています。うまくいけば、他の誰かがこれに遭遇し、解決策を持っているかもしれません。回答ありがとうございます。(サブレポートの内容についてはあまり情報を提供していませんが、かなり非公開です。それでも、レポートと関連するサブレポートの内容は変更されていないことを保証できます。Gitで確認してください。 )。