2012-07-06 54 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并存储对其的引用。

概括起来:

  • 不能期望时执行错误确实有状态的客户端可见无国籍行为。
  • 无法保证从池中返回哪个实例。
相关问题