我一直在测试我的无状态ejb:
爪哇:
@Stateless
@Remote
public class PersonBean {
private String name;
private int reputation;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getReputation(){
return reputation;
}
public void addReputation(){
reputation++;
}
/**
* Default constructor.
*/
public PersonBean() {
// TODO Auto-generated constructor stub
reputation=1;
}
}
和servlet:
@EJB
PersonBean person;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
person.setName("Mahdi");
String str=person.getName();
person.addReputation();
response.getWriter().write(person.getName()+"
with"+person.getReputation());
}
但是当我调用servlet时它返回:null with 1
。它应该返回Mahdi with 1
。这发生在一个请求中。为什么会这样?
答案 0 :(得分:0)
我认为您需要了解有关无状态EJB如何工作的一些关键概念。
在某些时候,可以存在位于EJBContainer的PersonBean
个对象的多个实例。
这个实例集合由EJBContainer管理,
这意味着它可以添加/删除并选择哪一个将完成工作。
@EJB
PersonBean person;
如果有多个实例,前一个代码注入了哪一个?
没有人,实际上person
是位于EJB容器中的对象的代理,
充当代码和ejb实例之间的中介。
每次使用此代理调用业务方法时, 它向EJBContainer组件发送消息,除其他外, 从列表中选择将处理请求的实例。
假设有三个ejb实例:
//the first one process this request
person.setName("Mahdi");
//a second instance processes this other request, thus, null is returned.
String str=person.getName();
//and a third one could process this; thus his reputation attribute will be 2
person.addReputation();
如您所见,三个操作(set,get和addReputation)由不同的对象解决。