我正在做一些实验来帮助巩固我对 @Singleton EJB 的理解。
我已经实现了一个名为 TotalBean 的 EJB,如下所示:
@Singleton
public class TotalBean implements TotalBeanLocal {
@Override
public String getName() {
return toString();
}
}
我将它注入(inject)到消息驱动的 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 至少有两个实例:
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
- 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@1b8e347
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
- 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@16ba6b2
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
- 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@1b8e347
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
任何人都可以帮助我理解我对 @Singleton EJB 的理解中的错误吗?
谢谢!
-----斯科特。
最佳答案
您是说您有两个应用程序,并且每个应用程序中的单例都不同?
The EJB and message-driven bean are deployed in one application, and the servlet in another application.
这是根据规范 http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html :
A singleton session bean is instantiated once per application and exists for the lifecycle of the application. Singleton session beans are designed for circumstances in which a single enterprise bean instance is shared across and concurrently accessed by clients.
关于jakarta-ee - 为什么我会得到两个 Singleton EJB 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562648/