0

このディスカッションで説明したソリューションを使用して、BackgroundJobManager を JSF Bean クラス内の内部クラスとして実装しました。また、BackgroundJobManager のスケジュールされた時間に実行されるスレッドとして、ABCTask (これも内部クラス) を作成しました。メッセージを JSF ページにプッシュする必要がありますが、タスク クラス ABCTask からプッシュすると NPE が発生します。同じことが外側の Bean でも機能するので、この内部クラスと Bean のコンテキストに関係があると確信しています。誰かがこれに対する解決策を知っていれば幸いです。

私の内部クラスコードは以下の通りです:

 public class ABCTask implements Runnable {

    public ABCTask() {

    }

    @Override
    public void run() {           
        setTimeoutOccuredFlag(true);

        try {
                if (getActiveControlledAgent().isEventLogRunning()) {
                    getActiveControlledAgent().setEventLogRunning(false);
                }
                printTimeoutMessage();
        logger_o.fine("Now leaving the ABCTask ...");
        } catch (Exception e) {
            logger_o.error("An error while idling "+e.getMessage());
        }
    }

}

$printTimeoutMessage() は次のとおりです。

void printTimeoutMessage() {
    FacesUtils.addErrorMessage(MESSAGES.getString("common.timeoutOccured"));
}
4

1 に答える 1

0

基本的に手動でスレッドを生成しています。はFacesContext、 の URL パターンに一致する HTTP 要求を処理するスレッドでのみ使用できますFacesServlet。他のスレッドでは使用できません。は、他のすべてのスレッドでFacesContext#getCurrentInstance()返されます。null

もう一度考えてみてください。クライアントが HTTP 要求を送信していない状態で、HTTP 応答にメッセージを送信するにはどうすればよいでしょうか? デフォルトでは、クライアントが要求しない限り、クライアントに何も送信できません。

ポーリング/プッシュ手法を探します。この具体的な問題は、クラス階層/スコープとはまったく関係ありません。将来、 が正確に何であるかを特定できれば、あなたと私たちにとってより役立つでしょうnull。あなたはそれをまったくしていないようです。

于 2013-03-13T12:22:40.760 に答える