3

WebサービスをステートレスセッションBeanとして公開することのスレッドセーフ関連の利点はありますか?
(間違っている場合は訂正してください)しかし、Webサービスはスレッドセーフではなく、サーブレットのように、サーバーによって作成されるWebサービスクラスのインスタンスは1つだけです(リクエストごとに1つのインスタンスではありません)。

ステートレスBeanのようなBeanのプールから割り当てられているかどうかは、アプリサーバーによってわかりません。すでに@WebServiceアノテーションが付けられているWebサービスで@Statelessアノテーションを使用するかどうかを調べようとしています。これにより、アプリサーバーは着信リクエストごとにプールからのアノテーションを開始します。そうすれば、着信リクエストごとに1つの個別のインスタンスが作成されることが確実にわかりますか?

4

1 に答える 1

9

序章

Webサービスエンドポイントによって使用されるインスタンスの数は、使用しているフレームワークによって異なります。

単純なエンドポイント(つまり、ApacheCXFまたはSpringWebサービスを備えたJAX-WS)を使用する場合、すべてのスレッド/要求(サーブレット)に対して単一のサービスインスタンスがあります。したがって、定義上、この種のサービスはステートレスであることを意味します。ただし、サービスに状態を追加する必要がある場合は、それを行うことができますが、サービススレッドを安全にするのは開発者の責任です。

EJBを使用すると、柔軟性が高まります。ステートレスBeanを使用すると、すべての要求を管理するためのインスタンスのプールができます(poolSize = 1の場合、Apache CXFと同じ動作が得られます)。繰り返しになりますが、ステートレスBeanに状態を追加することはできますが、管理するインスタンスのプールがあるため、スレッドセーフにするのはさらに困難です。ただし、ステートが必要な場合は、ステートフルBeanを使用して、スレッドセーフに関する作業を容易にするフレームワークを作成できます。

サービス状態に関するいくつかのヒント

サービスの状態を保持しない場合、Webサービスはスレッドセーフです。言い換えれば、定義上スレッドセーフの場合はステートレスサービスです。

すべてのスレッド/リクエストで共有する必要がある状態が必要な場合は、ステートレスサービス(JAX-WSまたはpoolSize = 1のステートレスセッションBean)に状態を追加できますが、sycnブロックを追加してスレッドセーフにする必要があります(同期しないでください@WebMethod)。重要:理論上(および実際には)、ステートレスセッションBeanに状態を追加しないでください。プールは、「必要な」ときにインスタンスを破棄/作成できるためです。

現在のスレッド/リクエストでのみ使用される状態を維持する必要がある場合は、ThreadLocal変数を使用してステートレスサービスに状態を追加するか、ステートフルセッションBeanを使用してより簡単に状態を追加できます。

さて、最後に、あなたの質問に答えます

  1. ステートレスセッションBeanは、スレッドセーフにした場合にのみスレッドセーフになります。状態を持たないようにする必要があります:-)
  2. 従来のWebサービスとステートレスセッションBeanWebサービスの唯一の違いは、最初のサービスが単一のインスタンスを持ち、2番目のサービスがインスタンスのプールを使用する場合です。poolSize = 1の場合、同じ効果が得られますが、理論的には、プールは「必要な」ときにインスタンスを破棄する可能性があります。

お役に立てば幸いです。

于 2012-07-15T18:05:24.593 に答える