4

JAX-WS 経由の Web サービスに問題があります。Web メソッドでスレッドを開始すると、クライアントとの接続が終了している間にスレッドが終了します。

例:

@WebMethod(operationName="test")
public boolean test()
{
  Thread th = new MyThread();
  th.start();
  // Thread is running
  ...
  return true;
  // Now thread th ends;
}

スレッド th を実行し続けるための解決策はありますか?

4

2 に答える 2

5

問題は、Java EE アプリケーション サーバーでスレッドを開始しようとしていることです。手動スレッド化は Java EE 仕様に違反しているため、問題が発生しています。一部のアプリ サーバーでは、別のスレッドをまったく開始することさえできません。仕様から:

エンタープライズ Bean は、スレッドの管理を試みてはなりません。エンタープライズ Bean は、スレッドの開始、停止、一時停止、再開、またはスレッドの優先順位や名前の変更を試みてはなりません。エンタープライズ Bean は、スレッド グループの管理を試みてはなりません。これらの関数は、EJB コンテナ用に予約されています。エンタープライズ Bean がスレッドを管理できるようにすると、ランタイム環境を適切に管理するコンテナーの機能が低下します。

別のスレッドで作業を行う必要がある場合は、アプリ サーバーが提供する非同期作業用の機能を使用する必要があります。いくつかのオプションは、データを JMS キューに入れ、MDB で処理するか、非同期 ejb リクエストを使用する可能性があります (Java EE 6 にあると考えてください)。

于 2013-01-21T13:50:10.200 に答える
0

スレッドが終了したことを返す前に確認したい場合 - 最も簡単な方法は th.join() です。このメソッドは、スレッドが終了するのを待ちます。

于 2013-01-21T14:08:38.777 に答える