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

2019-10-17 14:03发布

我有以下情况:请求范围的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豆

@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 ...

Answer 1:

这是因为容器(发生)每一次给你同样的bean实例,不是你应该依靠。

无状态会话豆不应该依赖于实例变量,如在你的榜样。

从Java EE的教程: http://docs.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf

无状态会话Bean

无状态会话Bean不维护与客户端的会话状态。 当客户端调用无状态bean的方法,bean的实例变量可能含有的状态speciic到客户端,但仅用于调用期间。 当该方法inished,客户speciic状态不应该被保留。 客户可能,但是,改变实例变量的状态,汇集无状态bean,并且这个状态保持到汇集无国籍豆的下一次调用。 除方法调用期间,无状态Bean的所有实例都是等价的,允许EJB容器的实例分配给任何客户端。 也就是说,无状态会话bean的状态应该在所有的客户端应用。



文章来源: stateless EJB3 bean invoked from request-scoped JAX-RS web service accumulates state