我遇到以下情况:请求范围的 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());
}
@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 ...
答案 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应该适用于所有客户端。