1

組み込みのJettyを使用して標準のJavaWebアプリを起動しています。私のランチャーは次のようなものです。

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle.Listener;
import org.eclipse.jetty.webapp.WebAppContext;

...

Listener listener = ...;
Server server = new Server(8080);
WebAppContext webapp = new WebAppContext();
...
webapp.addLifeCycleListener(listener);

server.setHandler(webapp);
server.start();
...

これはすべて正常に機能し、アプリを起動して参照でき、すべてが機能しているように見えます。

しかし今、私はランチャーにエラー報告を追加しようとしています。contextInitialized()のメソッドで例外をスローするようにWebアプリケーションを一時的に設定しましたServletContextListener。例外がスローされ、次のログメッセージが表示されます。

ERROR org.eclipse.jetty.util.log Failed startup of context WebAppContext@...

しかし、私のLifeCycleListenerは失敗イベントを受け取りません。実際、startedイベントを受け取り、WebAddContextリスナーに渡されたものは、に対してfalseを返し、に対してLifeCycle#isFailed()trueを返しますLifeCycle#isRunning()

Webアプリケーションを参照すると、503ServiceUnavailableエラーが発生します。

これは、Jettyバージョン7.0.1.v20091125および7.2.1.v20101111で発生します。Jetty 7apidocsを参照してください。

4

2 に答える 2

2

Heriの回答に対する私のコメントによると、WebAppContextは例外を飲み込みます。そうしないと、AbstractLifeCycleによってキャッチされ、失敗イベントが送信されます。これは私をそこへの道のほとんどに連れて行きます:

public class ThrowyWebAppContext extends WebAppContext {
    @Override
    protected void doStart() throws Exception {
        super.doStart();
        if (getUnavailableException() != null) {
            throw (Exception) getUnavailableException();
        }
    }
}
于 2010-12-01T23:11:17.150 に答える
1

正しく失敗したコンテキスト要素のライフサイクルがコンテキスト自体のライフサイクルに伝播されないことを覚えている場合(失敗したコンテキストがサーバー自体のライフサイクルに伝播されないように)。SecurityHandlerServletHandlerおよびSessionHandlerコンテキストのライフサイクルも確認してください。

于 2010-12-01T22:33:52.247 に答える