1

次のような状況があります: リクエスト スコープのJAX-RSサービスがステートレスEJB3 Bean を呼び出し、EJB3 Bean はクライアントからの Web サービスの連続する呼び出し間で状態を保持します。

次のようにコードします。

ウェブサービス

@javax.enterprise.context.RequestScoped
@Path("/actions")
public class CounterFrontEnd {

    @EJB
    private ICounterService.ILocal counterService;

    @GET @Produces("application/text;") @Path("/counter")
    public String counter() {
        return String.format("%d ", counterService.incCounter());
    }

ステートレス EJB3 Bean

@Stateless
@Local (ICounterService.ILocal.class)
@Remote(ICounterService.IRemote.class)
public class CounterService implements ICounterService.ILocal, ICounterService.IRemote {

    public int counter = 0;
    @Override
    public int incCounter() {
        return counter++;
    }

次に、次の Python スクリプトを使用してサービスを呼び出します。

for i in range(100):
  os.system( 'curl  http://somewhere:8080/counter-ws/rest/actions/counter' ) 

驚くべきことに、出力は次のとおりです。

1 2 3 4 5 ...
4

1 に答える 1

3

これは、コンテナーが (たまたま) 毎回同じ Bean インスタンスを提供するためであり、依存すべきものではないためです。

ステートレス セッション Bean は、例のようにインスタンス変数に依存しないでください。

Java ee チュートリアルから: http://docs.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf

ステートレス セッション Bean

ステートレス セッション Bean は、クライアントとの会話状態を維持しません。クライアントがステートレス Bean のメソッドを呼び出すと、Bean のインスタンス変数には、そのクライアントに固有の状態が含まれる場合がありますが、呼び出しの間だけです。メソッドが終了すると、クライアント固有の状態は保持されません。ただし、クライアントは、プールされたステートレス Bean のインスタンス変数の状態を変更することができ、この状態は、プールされたステートレス Bean の次の呼び出しまで保持されます。メソッドの呼び出し中を除いて、ステートレス Bean のすべてのインスタンスは同等であるため、EJB コンテナはインスタンスを任意のクライアントに割り当てることができます。つまり、ステートレス セッション Bean の状態は、すべてのクライアントに適用される必要があります。

于 2013-01-07T18:25:29.480 に答える