ここで説明するのと同様の方法でJettyを埋め込みます。指定されたログファイルを開くことができない場合、RequestLogHandler
残念ながらキャッチされorg.eclipse.jetty.server.Server
て飲み込まれた例外がスローされます(ただし、少なくとも最初にログに記録されます)。これは、ログハンドラーが正しく開始されたかどうかを判断する明確な方法がないことを意味します。
ハンドラーを開始できなかったことを検出するために私が見逃している方法はありますか?
この考え方は、 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
この目的のために を参照することをお勧めします。
桟橋のコードを変更するのはどうですか? RequestLogHandler の戦略的な場所にいくつかの単純な println ステートメントを追加して、ハンドラーが開始されたかどうかを示すことができます。