2011-07-27 9 views
1

私はJavaの世界でも新しく、tomcatの世界でも新しいです。だから問題は:クラスをtomcatとデーモンとして設定する方法は?

私はデーモンとしてJavaクラスを実行する必要があります。このクラスは、tomcatリクエストとcomunicateできる必要があります。

私はこれをCで行ったとき、バイナリファイルをバックグラウンドプロセスとして実行しました。

進め方を教えてください。

ありがとうございます。

答えて

3

答えに2つの部分があるように聞こえます。最初のものは、デーモンがTomcatコンテナーで始動することを確認することです。もう1つは、シャットダウン後にtomcatインスタンスを有効にしないように、スレッドが正しく構成されるようにすることです。

スレッディングに関する部分が簡単なので、まずそれを外しておきます。作成するすべてのスレッドはデーモンスレッドでなければなりません(例:Thread.setDaemon(true))。 O'reilly's Exploring Java's Chapter on Threadsから引用:

を多くのケースでは、私たちが本当にしたいことは、アプリケーションに簡単な、定期的なタスクを実行するバックグラウンドスレッド を作成することです。 setDaemon() メソッドを使用して、他のアプリケーションスレッドが残っていないときに、 になるはずのデーモンスレッドとしてスレッドをマークすることができます。 通常、Javaインタープリタは、すべてのスレッドが を完了するまで実行を続けます。しかし、デーモンスレッドがまだ生き残っている唯一のスレッドである場合、 インタプリタは終了します。

live non-daemonスレッドを使用すると、tomcatのクリーンシャットダウンを防止できます。その理由は、tomcatはシャットダウンメッセージを受信するまで、デーモンではない1つのスレッドが起動していることを示しています。この時点で、スレッドは停止しています。他の非デーモンスレッドがある場合、JVMはうまくパターを続けているので、コマンドラインからプロセスを強制終了する必要があります。

これでサービスを起動するためにサーブレットコンテナのライフサイクルに入ることになりました。ここでは2つのステップがあります...ジム・ギャリソンが提案したようにServletContextListenerを実装してから、コンテナにロードするように指示する必要があります。二つのものがここにあります

ステップ1:

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でそれを宣言します。ServletContextListener実装

<listener> 
    <listener-class>MyDaemonServletContextListener</listener-class> 
</listener> 

をそして、それはそれでなければなりません。

+0

ありがとうstevevls、私はあなたの言うことを理解しています。しかし、私はどのようにして風穴に言う: "ねえ、クラスXはデーモンです、あなたが起動するとすぐに、それを開始"? – subzero

+0

@サゼロ大丈夫...私は答えを書いた。希望が役立ちます。 – stevevls

1

ServletContextListenerと思っていますが、これはサーブレットコンテキストの起動とシャットダウン時に呼び出されます。そこからデーモンスレッドを開始および停止することができます。

関連する問題