Windows で実行され、Lucene と Solr を呼び出してインデックス作成ジョブを実行する Quartz アプリケーションを作成しています。一連のジョブを実行し、各ジョブは次の手順で構成されます。
- Tomcat が停止していることを確認します (Tomcat で実行されている Solr は、インデックス dir の削除またはコピーを防ぎます)。
- 必要に応じて古いインデックス ディレクトリを削除する
- Tomcat を起動
- Tomcat と Solr アプリが実行されていることを確認します
- インデックス作成ジョブを実行する
- Tomcat を停止する
- Tomcat が停止していることを確認する
- インデックス ディレクトリをアーカイブにコピーする
Tomcat を起動および停止するコードで、Startup.bat、Shutdown.bat、および Catalina.bat に設定されているシステム プロパティを設定し、「start」および「stop」パラメーターを指定して Bootstrap.main を呼び出すことにしました。これは 1 回の反復では機能しましたが、2 回の反復をセットアップした Quartz の実行を試みたときには機能しませんでした。
私のコードが最初の繰り返しの終わりにTomcatをシャットダウンしたとき、通常のメッセージがすべて表示されました。
INFO: Stopping ProtocolHandler ["http-bio-5918"]
(私はポート5918を使用しています)しかし、2回目の反復の開始時にTomcatを起動しようとすると、次のエラーが発生しました:
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-5918"]
java.net.BindException: Address already in use: JVM_Bind <null>:5918
と
SEVERE: Failed to initialize connector [Connector[HTTP/1.1-5918]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-5918]]
コマンド プロンプト ウィンドウで netstat -an を実行したところ、ポート 5918 が使用中であることが確認されました。Tomcat が実行されているかどうかを確認するために使用しているコードには、特別なことは何もありません。インターネットでいろいろなところで見かけました。
public boolean isTomcatRunning(String url) {
boolean isRunning = false;
try {
new URL(url).openConnection().connect();
isRunning = true;
} catch (IOException e) {
isRunning = false;
}
return isRunning;
}
しかし、Tomcatが実行されているときにTomcatが実行されていないことを明らかに示しています。
前述したように、Bootstrap.main(new String[]{"start"}) と Bootstrap.main(new String[]{"stop"}) を呼び出して Tomcat を開始および停止しています。それについての唯一の奇妙な点は、単に Bootstrap.main(new String[]{"start"}) を呼び出すと、返されないように見えることです (まだ十分に待っていないため、ぶら下がったり、時間がかかるだけです)、スレッド内で実行しています。
Catalina.bat は何も特別なことをしていないように見え、起動から正常に戻るため、おそらくそれが問題を引き起こしているのでしょう。ハングせずにメインスレッドでスタートアップを実行できるようにするために必要な追加のセットアップがあるのではないかと思います。
いずれにせよ、これは私が自分の Quartz アプリケーション内から Tomcat を開始および停止することに当惑していることです。