2012-02-14 10 views
3

デーモンスレッドの負荷を生成するアプリがあります。アプリがシャットダウンされると、それぞれをシャットダウンしたいと思います。Websphereはデーモン・スレッドを尊重しますか?

私はWebsphere 7がそれらをすべて停止していないかもしれないと少し心配しています。

Websphere 7でデーモンスレッドが異なる方法で扱われるかどうかは誰にも知られていますか?

注:私は手動でスレッドを作成すべきではないことを知っています。WebSphere WorkManagerなどを使用する必要がありますが、このアプリケーションはTomcatとWebSphereで実行する必要があります。

私はいくつかのコンテキスト/シャットダウンメカニズムにすべてのスレッドを関連付ける必要があることを知っていますが、これは進行中です。

+0

スレッドを管理しているのですか、スレッドプールを使ってスレッドをプルしていますか? –

答えて

4

各WASサーバーは1つのJVMを実行し、デーモンスレッドはアプリケーションのライフサイクルではなく、JVMのライフサイクルに関連付けられます。したがって、アプリケーションが停止したときにデーモンスレッドがシャットダウンされることを期待しないでください。

すでに説明したように、手動でスレッドを作成しないでください。 Java EE仕様ではこれを禁止しています。Java EEコンテナの動作は、既に見つかったスタンドアロンJavaアプリケーションとは異なります。残念ながら、WorkManagerに相当するJava EE標準は現在存在しません。ただし、JSR-236(Concurrency Utilities for Java EE)は、Java EE 7に含める候補として戻ってきます。

一方、WASではasynchronous beansWorkManager)を使用できます。このメソッドを使用して、スレッドをアプリケーションのライフサイクルに結びつけました。

  • CommonJ WorkManager
  • Servlet 3.0非同期サーブレット
  • :あなたにも、別の容器に(Tomcatを)実行する必要があるため

    ただし、アプリケーションで並行性を扱う考慮すべきいくつかの他のオプションがあるかもしれませんServletContextListenerをウェブアプリのライフサイクルにフックする

他の可能性のある対応の処理オプションrencyは、以下のものが含まれるが、これらは、Tomcatで使用できない場合がありますEJBを、必要:

  • EJB 3.1非同期Beanここ

  • は、同時実行のトピックに関するいくつかの関連するスレッドです

    0

    Websphereは単なるJavaアプリケーションです。 JVMまたはJavaランタイム環境の機能であるデーモンスレッドを尊重したり、尊重したりすることはできません。したがって、Java EEアプリケーション内でデーモン・スレッドを作成すると、すべてのアプリケーション・サーバーでデアモン・スレッドになります。

    また、正規のスレッドを作成しても、アプリケーションサーバーがシャットダウンするのを防ぐことはできません。すべてのアプリケーションサーバーのシャットダウンメカニズムは、すべてのコンポーネントを閉じようとします。最後にSystem.exit()を実行して、 )、スレッドを手動で開きます。

    +0

    私は彼が、アプリケーション全体をシャットダウンすることを話していると思います。コンテナ全体ではありません。その場合、スレッドは自動的に終了しません。 –

    1

    言われたように、あなたはこれをするべきではありませんが、それを行う良い方法はありません。これは私にとっては何の問題も生じませんでした。

    このアプローチでは、集中的なスレッド作成と、アプリケーション停止時にスレッドを終了するためのリスナーの使用が必要です。

    あなたはいくつかのことを行う必要があるでしょう:

    1. は(それを呼び出すThreadService)単一のクラス内のすべてのスレッドの作成を一元化。スレッドがここで作成されるとき、リストに入れておくと、後でリストをループしてそれらをすべて停止することができます。
    2. スレッドが実装するインターフェイスを作成します。これにより、同じインターフェイス経由で各スレッドを停止できます。あなたが持っている各スレッドは、これを処理するための独自のメカニズムを実装する必要があります。たとえば、スレッドがループとThread.sleep()を使用している場合、stopped = trueを設定してスレッドを中断します。ループはこれをチェックして、stopped = trueのときループから壊れます。
    3. リスナーを作成し、ServletContextListenerを実装します。 contextDestroyed()が呼び出されると、ThreadService.stopThreads()を呼び出します。このリスナーをweb.xmlに登録します。
    関連する問題