私はJavaの世界では初めてであり、Tomcatの世界でも新しいです。したがって、問題は次のとおりです。
Javaクラスをデーモンとして実行する必要があります。このクラスは、Tomcatリクエストと通信できる必要があります。
以前:Cでこれを行ったとき、バックグラウンドプロセスとしてバイナリファイルを実行しました。
進め方を教えていただけますか?
よろしくお願いします!
したがって、答えには2つの部分があるように思えます。1つは、デーモンがTomcatコンテナーで起動することを確認することであり、もう1つは、シャットダウン後にtomcatインスタンスを存続させないようにスレッドが適切に構成されていることを確認することです。
スレッドに関する部分は単純なので、最初にそれを邪魔にならないようにします。生成するすべてのスレッドはデーモンスレッドである必要があります(たとえば、Thread.setDaemon(true)を呼び出した場合)。O'reillyのExploringJavaのスレッドに関する章からの引用:
多くの場合、私たちが本当に望んでいるのは、アプリケーションで単純な定期的なタスクを実行するバックグラウンドスレッドを作成することです。setDaemon()メソッドを使用して、他のアプリケーションスレッドが残っていないときに強制終了して破棄する必要があるデーモンスレッドとしてスレッドをマークできます。通常、Javaインタープリターは、すべてのスレッドが完了するまで実行を続けます。ただし、デーモンスレッドがまだ生きている唯一のスレッドである場合、インタプリタは終了します。
デーモン以外のスレッドをライブにすると、Tomcatのクリーンシャットダウンが妨げられます。この理由は、tomcatがシャットダウンメッセージを受信するまで1つの非デーモンスレッドを実行し続け、その時点でそのスレッドが停止するためです。デーモン以外のスレッドが他にある場合、JVMは問題なくパターを続け、コマンドラインからプロセスを強制終了する必要があります。
そして今、私たちはサービスを生み出すためにサーブレットコンテナのライフサイクルにフックすることに取り掛かります。ここには2つのステップがあります... ServletContextListener
JimGarrisonが提案したように実装する必要があります。次に、コンテナーにロードするように指示する必要があります。ここには2つのことがあります。
ステップ1:実装ServletContextListener
:
public class MyDaemonServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Thread th = new Thread() {
public void run() {
// implement daemon logic here.
}
};
th.setDaemon(true);
th.start();
}
public void contextDestroyed(ServletContextEvent sce) {
// you could notify your thread you're shutting down if
// you need it to clean up after itself
}
}
ステップ2:あなたの中でそれを宣言しますweb.xml
:
<listener>
<listener-class>MyDaemonServletContextListener</listener-class>
</listener>
そしてそれはそれであるはずです。
ServletContextListener
サーブレットコンテキストの起動時とシャットダウン時に呼び出されるが必要だと思います。そこからデーモンスレッドを開始および停止できます。