アプリケーション サーバー (GlassFish) にデプロイしたい Java プログラム/スレッドがあります。スレッドは、Application Server の起動時に開始し、Application Server の終了時に停止する「サービス」として実行する必要があります。
どうすればこれを行うことができますか?これは実際にはセッション Bean や MDB ではありません。ただの糸です。
アプリケーション サーバー (GlassFish) にデプロイしたい Java プログラム/スレッドがあります。スレッドは、Application Server の起動時に開始し、Application Server の終了時に停止する「サービス」として実行する必要があります。
どうすればこれを行うことができますか?これは実際にはセッション Bean や MDB ではありません。ただの糸です。
私はこれを Tomcat でしか実行していませんが、Glassfish でも動作するはずです。
を実装する Listener クラスを作成しjavax.servlet.ServletContextListener
、web.xml に配置します。Web アプリが開始されて破棄されると通知されます。
シンプルな Listener クラス:
public class Listener implements javax.servlet.ServletContextListener {
MyThread myThread;
public void contextInitialized(ServletContextEvent sce) {
myThread = new MyThread();
myThread.start();
}
public void contextDestroyed(ServletContextEvent sce) {
if (myThread != null) {
myThread.setStop(true);
myThread.interrupt();
}
}
}
これは、最後の「context-param」の後、最初の「サーブレット」の前に web.xml に入ります。
<listener>
<listener-class>atis.Listener</listener-class>
</listener>
この種のことが推奨されるかどうかはわかりませんが、過去にはうまくいきました。
これは、アプリ サーバーによって提供されるマネージド スレッドにアクセスできない限り、どのアプリ サーバーでも行うべきことではありません。私は Glassfish には詳しくありませんが、共通の WorkManager を使用して Websphere または Weblogic でこれを行うことができます。
どうやら、Glassfish と JBOSS で JCA WorkManager を介して同じことが実現できるようです (私はよく知りません)。
メインプログラムであるスレッドを開始する init メソッドを持つサーブレットを作成します。
public void init() throws ServletException {
mailThread = new MailSendThread();
mailThread.start();
}
アプリケーションの web.xml ファイルに、load-on-startup 要素を含むサーブレットを追加します。数字は開始順序です。
<servlet>
<servlet-name>Mail Sending Servlet</servlet-name>
<servlet-class>MailServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
タイマー サービスを使用して時間指定オブジェクトを開始し、有効期限は 1 つだけです。次に、タイムアウトで、スレッドでやりたいことを行います。
http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html
J2EEコンポーネントを使用し、別のスレッドであるため、私にとってはうまくいきました。
また、いくつかのスレッドを作成する必要があります。各スレッドは、Glassfish アプリで実行されている別のリモート プロセスへのソケットを開きます。サーバ。実装する必要がある Glassfish が提供する LifecycleListener Bean を調べました。
LifecycleListener 実装でスレッド化とソケット作業を実行するプロトタイプを作成しましたが、これらのリソースの管理にはまったく役に立ちませんでした。LifecycleListener にアクセスするには、目的のアクションを実行する public staticメソッドを配置する必要がありました。
LifecycleListener には値がありません。これは、LifecycleListener を呼び出すクライアントである EJB 内でまったく同じ作業を実行できたからです。Bean には Thread と Socket の適切な管理が実際には存在しないためです。
JCAが最善の方法かもしれないと言われました。私はこれを試していません。