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-instance,而不是你应该依赖的东西。

无状态会话 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 回答