2009-04-03 2 views
1

Notre application WebLogic J2EE, vieille de plusieurs années, dispose d'un bean géré par message qui utilise un bean de session sans état. La méthode MDB onMessage obtient l'interface home du bean de session sans état et appelle la méthode create() de l'interface home pour obtenir le bean de session sans état proprement dit.MDB doit-il appeler remove() après avoir utilisé un bean de session sans état?

Le code ne tente pas de mettre en cache la fève de la session, juste utilise directement:

public void onMessage(Message message) 
{ 
    ... 
    MySessionBeanLocal ejbLocal = MySessionBeanLocalHome.create(); 
    ejbLocal.myMethod(); 

Il n'y a pas d'appel correspondant remove() dans le MDB.

Ma question est: est-il mauvais de ne pas appeler remove() dans ce cas?

Je suis assez sûr que l'on est tenu d'appeler remove() pour un état ful bean session, mais il est moins clair pour moi si le supprimer appel est nécessaire() état moins.

Nous avons récemment fait d'importantes améliorations de performances, mais tout d'un coup commencé à manquer de beans session stateful sous charge à cette exception:

java.lang.RuntimeException: Un appel d'EJB MyMessageDrivenBean (Application: MyApplication, EJBComponent: MyApplication .jar) a expiré en attendant d'obtenir une instance de la piscine libre. à weblogic.ejb20.pool.StatelessSessionPool.waitForBean (StatelessSessionPool.java:229) à weblogic.ejb20.pool.StatelessSessionPool.getBean (StatelessSessionPool.java:100) à weblogic.ejb20.manager.StatelessManager.preInvoke (StatelessManager. java: 140) à weblogic.ejb20.internal.BaseEJBLocalObject.preInvoke (BaseEJBLocalObject.java:228) à weblogic.ejb20.internal.StatelessEJBLocalObject.preInvoke (StatelessEJBLocalObject.java:53) à MyMessageDrivenBean_x56omo_ELOImpl.processMessage (MyMessageDrivenBean_x56omo_ELOImpl.java: 28) à MyMessageDrivenBean.onMessage (TBMessageListener.java:94) à weblogic.ejb20.internal.MDListener.execute (MDListener.java:370) à weblogic.ejb20.internal.MDListener.onM essage (MDListener.java:262) à weblogic.jms.client.JMSSession.onMessage (JMSSession.java:2678)

Notre piscine MDB est réglé sur:

<message-driven-descriptor> 
<pool> 
    <max-beans-in-free-pool>20</max-beans-in-free-pool> 
    <initial-beans-in-free-pool>5</initial-beans-in-free-pool> 

Notre piscine de bean session sans état est modifiee:

<stateless-session-descriptor> 
<pool> 
    <max-beans-in-free-pool>50</max-beans-in-free-pool> 
    <initial-beans-in-free-pool>5</initial-beans-in-free-pool> 

Ma question est, est le MDB qui appelle create() sur le bean session sans état également responsable de l'appel de la supprimer() pour l'état moins bean session ainsi? (L'application semble avoir fonctionné pendant des années sans appeler remove(), mais je me demande si le débit amélioré a exposé un ancien bogue.)

Répondre

0

La méthode remove() serait appelée quand l'objet de l'interface distante serait détruit. . Je pense qu'aucune application EJB ne devrait obliger explicitement à appeler les méthodes remove(), si cela arrive, c'est probablement parce que le pool est trop petit. Bien sûr, vous appelez toujours en utilisant pour le réglage fin, mais cela devrait être une exception, pas la règle.

Questions connexes