我们多年前的 WebLogic J2EE 应用程序有一个使用无状态会话 bean 的消息驱动 bean。MDB onMessage 方法获取无状态会话 bean 的 home 接口,并调用 home 接口的create()
方法来获取实际的无状态会话 bean 本身。
代码不会尝试缓存会话 bean,只是直接使用它:
public void onMessage(Message message)
{
...
MySessionBeanLocal ejbLocal = MySessionBeanLocalHome.create();
ejbLocal.myMethod();
MDB中没有对应remove()
的调用。
我的问题是:在这种情况下不打电话是不是很糟糕remove()
?
我相当确定需要调用remove()
一个有状态的会话 bean,但是对于 state less 是否需要调用对我来说不太清楚。remove()
我们最近进行了显着的性能改进,但突然开始在负载下耗尽有状态会话 bean,但有以下异常:
java.lang.RuntimeException: An invocation of EJB MyMessageDrivenBean(Application:
MyApplication, EJBComponent: MyApplication.jar) timed out while waiting to get an instance from the free pool.
at weblogic.ejb20.pool.StatelessSessionPool.waitForBean(StatelessSessionPool.java:229)
at weblogic.ejb20.pool.StatelessSessionPool.getBean(StatelessSessionPool.java:100)
at weblogic.ejb20.manager.StatelessManager.preInvoke(StatelessManager.java:140)
at weblogic.ejb20.internal.BaseEJBLocalObject.preInvoke(BaseEJBLocalObject.java:228)
at weblogic.ejb20.internal.StatelessEJBLocalObject.preInvoke(StatelessEJBLocalObject.java:53)
at MyMessageDrivenBean_x56omo_ELOImpl.processMessage(MyMessageDrivenBean_x56omo_ELOImpl.java:28)
at MyMessageDrivenBean.onMessage(TBMessageListener.java:94)
at weblogic.ejb20.internal.MDListener.execute(MDListener.java:370)
at weblogic.ejb20.internal.MDListener.onMessage(MDListener.java:262)
at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:2678)
我们的 MDB 池设置为:
<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>
我们的无状态会话 bean 池设置为:
<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>
我的问题是,调用create()
无状态会话 bean 的 MDB 是否也负责调用无状态会话remove()
bean ?(该应用程序似乎已经运行多年而没有调用,但我想知道提高吞吐量是否暴露了一个旧错误。)remove()