序章
Webサービスエンドポイントによって使用されるインスタンスの数は、使用しているフレームワークによって異なります。
単純なエンドポイント(つまり、ApacheCXFまたはSpringWebサービスを備えたJAX-WS)を使用する場合、すべてのスレッド/要求(サーブレット)に対して単一のサービスインスタンスがあります。したがって、定義上、この種のサービスはステートレスであることを意味します。ただし、サービスに状態を追加する必要がある場合は、それを行うことができますが、サービススレッドを安全にするのは開発者の責任です。
EJBを使用すると、柔軟性が高まります。ステートレスBeanを使用すると、すべての要求を管理するためのインスタンスのプールができます(poolSize = 1の場合、Apache CXFと同じ動作が得られます)。繰り返しになりますが、ステートレスBeanに状態を追加することはできますが、管理するインスタンスのプールがあるため、スレッドセーフにするのはさらに困難です。ただし、ステートが必要な場合は、ステートフルBeanを使用して、スレッドセーフに関する作業を容易にするフレームワークを作成できます。
サービス状態に関するいくつかのヒント
サービスの状態を保持しない場合、Webサービスはスレッドセーフです。言い換えれば、定義上スレッドセーフの場合はステートレスサービスです。
すべてのスレッド/リクエストで共有する必要がある状態が必要な場合は、ステートレスサービス(JAX-WSまたはpoolSize = 1のステートレスセッションBean)に状態を追加できますが、sycnブロックを追加してスレッドセーフにする必要があります(同期しないでください@WebMethod
)。重要:理論上(および実際には)、ステートレスセッションBeanに状態を追加しないでください。プールは、「必要な」ときにインスタンスを破棄/作成できるためです。
現在のスレッド/リクエストでのみ使用される状態を維持する必要がある場合は、ThreadLocal
変数を使用してステートレスサービスに状態を追加するか、ステートフルセッションBeanを使用してより簡単に状態を追加できます。
さて、最後に、あなたの質問に答えます
- ステートレスセッションBeanは、スレッドセーフにした場合にのみスレッドセーフになります。状態を持たないようにする必要があります:-)
- 従来のWebサービスとステートレスセッションBeanWebサービスの唯一の違いは、最初のサービスが単一のインスタンスを持ち、2番目のサービスがインスタンスのプールを使用する場合です。poolSize = 1の場合、同じ効果が得られますが、理論的には、プールは「必要な」ときにインスタンスを破棄する可能性があります。
お役に立てば幸いです。