2

具体的には、(構成エラーが原因で) Web アプリを初期化できない場合に、Tomcat が起動を中止するようにします。

  1. Tomcat シャットダウン ポートを使用しようとしています。私の Web アプリが起動するとき、それは準備ができていません。

  2. -Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true、機能しません。Tomcat は問題なく起動します。

  3. キャッチされていない例外をスローします。例外をスローしようとしました。Tomcat は引き続き正しく初期化されますが、Web アプリは機能しない状態にあります。

  4. Tomcat JMX API を使用します。どのシャットダウン方法でも、Tomcat がシャットダウンすることはありません。

これまでのところ、私が持っている唯一の他のオプションはSystem.exit(-1). それは機能しますが、Tomcat に対してそれを行うと問題が発生するのではないかと懸念しています。

4

4 に答える 4

5

Tomcat は、起動しない不適切に作成されたアプリケーションに対して回復力を持つように設計されています。

org.apache.catalina.startup.EXIT_ON_INIT_FAILURE は、Tomcat のコンポーネントの 1 つ (コネクタの 1 つなど) が起動しない場合 (たとえば、ポートが使用されているため)、Tomcat を停止するためのものです。

System.exit() は醜いですが、動作し、Tomcat に関する限り安全です (それに関しては kill -9 です)。このかなり残忍なシャットダウン方法を好まないのはアプリケーションです。

これをよりクリーンに行う Tomcat 固有の方法があります。カスタム LifecycleListener をサーバー コンポーネントに追加し、AFTER_START_EVENT に応答させます。リスナーにコンテナ階層をサーバーからコンテキスト [Server->Service(s)->Engine-Host(s)->Context(s)] にナビゲートさせ、各コンテキストが STARTED 状態であることを確認します。そうでない場合は、サーバーで stop() を呼び出してから destroy() を呼び出します。

于 2013-05-04T18:45:25.493 に答える
0

この質問は少し古いことは承知していますが、ここでは、箱から出してあなたが求めている解決策を考えて、もう少し先に進んでいきます。webapp の初期化に失敗したときに tomcat を停止することが要件のようです。これは「Tomcat の起動を中止する」とは少し異なります。Tomcat 自体は既に開始されており、開始直後に Web アプリケーションのデプロイを開始します。あなたの要件に基づいて、私はあなたが他の webapp を持っていないと仮定します。それなら、Spring Boot を使ってみませんか? Spring Boot は、自己完結型の Web アプリケーションをデプロイする方法を提供します。この場合、初期化に失敗すると、アプリケーションは起動しません。

于 2016-08-11T20:44:42.380 に答える
0

あなたのポイント No 1 Tomcat shutdown.bat ファイルを呼び出しているアプリケーションから初期化されていない状態の例外がスローされたときに、プログラムから shutdown.bat ファイルを呼び出そうとしたことを意味しますか。

于 2013-05-04T09:04:50.000 に答える