6

アプリケーション全体に複数の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で確認してください。 )。

4

1 に答える 1

6

私はまったく同じ問題を抱えていて、ここで提案されているように、サブレポートの isPrintWhenDetailOverflows プロパティを true から false に変更して解決しました: http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill

それが役に立てば幸い

于 2012-11-14T14:09:09.163 に答える