从请求范围的JAX-RS Web服务调用的无状态EJB3 bean累积状态

时间:2013-01-07 17:01:26

标签: ejb-3.0 jax-rs

我遇到以下情况:请求范围的 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 ...

1 个答案:

答案 0 :(得分:3)

这是因为容器(发生)每次都给你相同的bean-instance,而不是你应该依赖的东西。

无状态会话bean不应该依赖于示例中的实例变量。

来自java ee tutorial:http://docs.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf

  

无国籍会话豆

     

无状态会话bean不会保持会话状态   客户端。当客户端调用无状态bean的方法时,   bean的实例变量可能包含该客户端的特定状态   但仅限于调用的持续时间。当方法是   在推销时,不应保留客户特定的州。客户可以,   但是,更改池化无状态中的实例变量的状态   bean,这个状态被保留到下一次调用   混合无状态豆。除了在方法调用期间,所有实例   无状态bean的等价物,允许EJB容器   将实例分配给任何客户端。也就是说,无国籍的状态   会话bean应该适用于所有客户端。