在使用无状态会话bean之后,MDB应该调用remove()吗?

时间:2009-04-03 15:19:06

标签: weblogic ejb jboss-mdb stateless-session-bean

我们多年前的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()是不是很糟糕?

我很确定需要为{em> ful 会话bean调用remove(),但如果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>

我的问题是,在无状态会话bean上调用create()的MDB是否也负责为状态 less 会话bean调用remove()? (该应用程序似乎已经运行多年而没有调用remove(),但我想知道改进的吞吐量是否暴露了旧的错误。)

1 个答案:

答案 0 :(得分:0)

在远程接口对象被攻击之后,无论如何都会调用remove()方法。 我认为没有EJB应用程序应该强制显式调用remove()方法,如果发生这种情况,可能是因为池太小了。当然,你总是打电话给微调,但这应该是一个例外,而不是规则。