2012-07-06 58 views
0

我想通過使用上下文查找在POJO中注入一個EJB。 我所預料到的是EJB的無狀態的行爲,你當你做一個初始上下文查找返回相同的實例|在Pojo中注入無狀態EJB

@EJB annotation 

該EJB具有的EntityManager這是我從EntityManagerFactory的獲得在構造函數中的蘇氨酸EJB得到

 @Stateless 
     Class ReprovProcess implements ReprovisioningProcess { 
     protected EntityManager em; 
     public ReprovProcess(){ 
     //init em from entityManagerFactory; 
     } 

     public EntityManager getEm(){ 
     return em; 
     } 
     } 

     @LocalBinding(jndiBinding = "ReprovProcess/local") 
     class interface ReprovisioningProcess { 
     } 

下一頁我查找EJB的兩倍,使得

  • 第一次檢索時我關閉的EntityManager

  • 然後在第二次查找時,我應該看到EntityManager處於打開狀態,因爲我期待着一個無狀態的EJB行爲。

但我沒有觀察到這一點。我第二次查找並做了一個em.isOpen(),我得到一個錯誤。

所以問題是:context.lookup可以用來獲得無狀態的EJB類行爲嗎? 如果不是可以使用什麼?

  ReprovisioningProcess pro = (ReprovisioningProcess)       
      ic.lookup("ReprovProcess/local"); 
      EntityManager em = pro.getEm(); 
      System.out.println("Entity Manager State = "+em.isOpen()); 
      em.close(); 
      System.out.println("Entity Manager State = "+em.isOpen()); 

      pro = (NetElementReprovisioningProcess) ic.lookup("ReprovProcess/local"); 
      em = pro.getEm(); 
      System.out.println("Entity Manager State = "+em.isOpen()); 
      em.close(); 
      System.out.println("Entity Manager State = "+em.isOpen()); 

輸出是

Entity Manager State = true 
Entity Manager State = false 
Entity Manager State = false 
------------- ---------------- --------------- 

EntityManager is closed 
java.lang.IllegalStateException: EntityManager is closed 
at org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:97) 
at com.cisco.cgms.factoryconfig.reprovision.ReprovisiongGroupTest.testIntialLookup(ReprovisiongGroupTest.java:135) 

回答

2

你誤會無國籍。這不是關於容器提供功能來將無狀態bean的實例設置回初始狀態。相反,開發人員應該小心,無狀態會話bean的所有實例都是可以互換的。這意味着無狀態bean永遠不應該具有客戶端可見的狀態。在你的情況下,getEm違反了本合同。

容器確實具有無狀態會話bean實例池。這是由容器決定哪些實例返回。這就是爲什麼你不能做哪些實例由以下查找返回任何假設:它可以是例如你之前使用

ic.lookup("ReprovProcess/local") 

,它可以作爲不失爲實例從未被任何客戶端。如果您需要客戶端可見的狀態,請使用有狀態會話Bean並存儲對其的引用。

概括起來:

  • 不能期望時執行錯誤確實有狀態的客戶端可見無國籍行爲。
  • 無法保證從池中返回哪個實例。
相關問題