我正在做一些實驗來幫助鞏固我對@Singleton EJB的理解。爲什麼我得到我的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在另一個應用。
我的期望是,我的GlassFish日誌每次使用singleton bean時都會包含相同的bean名稱,因爲在我的整個域中只創建一個singleton。相反,雖然日誌表明有我的 「單身」 bean的至少兩個實例:
- 信息:在servlet中,totalBean是TotalBean @1b8e347
- 信息:在消息驅動bean,totalBean被totalBean @ 1b8e347
- INFO:在小服務程序,totalBean是totalBean @ 1b8e347
- INFO:在消息驅動bean,totalBean是totalBean @16ba6b2
- INFO:在小服務程序,totalBean是totalBean @ 1B 8e347
- 信息:在消息驅動bean,totalBean是TotalBean @ 1b8e347
- 信息:在servlet中,totalBean是TotalBean @ 1b8e347
任何人可以幫助我理解錯我的@Singleton EJB的理解?
謝謝!
-----斯科特。
如果你設置了一些實例變量,我認爲它們應該相同。我猜你看到的2個實例只是一些pproxy – 2013-03-23 08:49:19
實例變量也不同;這就是我注意到這個問題的方式。我認爲從對象內返回名稱將返回對象本身的名稱,而不是其中一個代理。 – sgifford 2013-03-23 13:47:37