2

我们多年前的 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()

4

1 回答 1

0

remove()在远程接口对象被垃圾处理后,无论如何都会调用该方法。

我认为没有 EJB 应用程序应该强制显式调用 remove() 方法,如果发生这种情况,可能是因为池太小了。当然,您调用 always using 进行微调,但这应该是一个例外,而不是规则。

于 2009-04-29T17:58:34.530 回答