我正在做一些实验来帮助巩固我对@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 至少有两个实例:
- 信息:在 servlet 中,totalBean 是 TotalBean@ 1b8e347
- INFO:在消息驱动 bean 中,totalBean 为 TotalBean@1b8e347
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
- INFO:在消息驱动 bean 中,totalBean 为 TotalBean@ 16ba6b2
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
- INFO:在消息驱动 bean 中,totalBean 为 TotalBean@1b8e347
- 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
任何人都可以帮助我理解我对@Singleton EJB 的理解中的错误吗?
谢谢!
-----斯科特。