我正在做一些实验来帮助巩固我对@Singleton EJB的理解。
我实现了一个名为TotalBean的EJB,如下所示:
@Singleton
public class TotalBean implements TotalBeanLocal {
@Override
public String getName() {
return toString();
}
}
我将它注入到这样的消息驱动bean中:
@MessageDriven(mappedName = "jms/TestQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class TotalMessageBean implements MessageListener {
@EJB
TotalBeanLocal totalBean;
@Override
public void onMessage(Message message) {
System.out.println("In message-driven bean, totalBean is " + totalBean.getName());
}
}
还有这样的Servlet:
public class TaxTest extends HttpServlet {
@EJB
TotalBeanLocal totalBean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("In servlet, totalBean is " + totalBean.getName());
// Display page, etc.
}
}
EJB和消息驱动的bean部署在一个应用程序中,而servlet部署在另一个应用程序中。
我的期望是每次使用单例bean时,我的GlassFish日志将包含相同的bean名称,因为我的整个域中只会创建一个单例。相反,日志表明我的“单例”bean至少有两个实例:
有人能帮助我理解我对@Singleton EJB的理解错误吗?
谢谢!
-----斯科特。
答案 0 :(得分:0)
你说你有两个应用程序,每个应用程序中的单例是不同的吗?
EJB和消息驱动的bean部署在一个应用程序中,而servlet部署在另一个应用程序中。
这是根据规范http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html:
单个会话bean 每个应用程序实例化一次,并且在应用程序的生命周期中存在。 Singleton会话bean设计用于客户端共享和同时访问单个企业bean实例的情况。