4

ここで説明するのと同様の方法でJettyを埋め込みます。指定されたログファイルを開くことができない場合、RequestLogHandler残念ながらキャッチされorg.eclipse.jetty.server.Serverて飲み込まれた例外がスローされます(ただし、少なくとも最初にログに記録されます)。これは、ログハンドラーが正しく開始されたかどうかを判断する明確な方法がないことを意味します。

ハンドラーを開始できなかったことを検出するために私が見逃している方法はありますか?

4

2 に答える 2

2

この考え方は、 WebAppContext.getUnavailableException()を使用してコンテキストが正常に初期化されたかどうかを判断できるWebAppContextの実装に基づいています。

Server と Context のデフォルトの実装を独自のものに置き換えるだけです。

public static class MyContext extends Context {

    private Exception _exception;

    @Override
    protected void doStart() throws Exception {
        try {
            super.doStart();
        } catch (final Exception e) {
            _exception = e;
        }
    }

    @Override
    protected void doStop() throws Exception {
        try {
            super.doStop();
        } finally {
            _exception = null;
        }
    }

    public Exception getException() {
        return _exception;
    }

}

public static class MyServer extends Server implements InitializingBean {

    public void afterPropertiesSet() throws Exception {
        start();

        for (final Handler h : getHandlers()) {
            if (h instanceof MyContext) {
                final MyContext c = (MyContext) h;
                if (c.getException() != null) {
                    throw new RuntimeException("failed to init context " + c.getDisplayName(),
                            c.getException());
                }
            }
        }
    }
}

beans.xml で、とを独自の実装に置き換えるorg.mortbay.jetty.Server(および削除するinit-method="start")だけです。org.mortbay.jetty.servlet.Context

ただし、このコードはJetty 6用です(リンク先の例と同様)。それは私が持っているものです。私はそれをテストしませんでしたが、WebAppContext と組み合わせて正常に使用しているものとほとんど同じです。これを RequestLogHandler に拡張するには、使用している任意のハンドラーに対して同じことを行うか、デコレーターを作成して任意のハンドラーをラップすることができます。org.mortbay.jetty.handler.HandlerWrapperこの目的のために を参照することをお勧めします。

于 2010-04-21T16:40:53.833 に答える
0

桟橋のコードを変更するのはどうですか? RequestLogHandler の戦略的な場所にいくつかの単純な println ステートメントを追加して、ハンドラーが開始されたかどうかを示すことができます。

于 2010-04-21T00:06:57.560 に答える