Должен ли MDB вызывать remove () после использования сессионного компонента без сохранения состояния? - PullRequest
2 голосов
/ 03 апреля 2009

Наше летнее J2EE-приложение WebLogic имеет управляемый сообщениями компонент, который использует сессионный компонент без сохранения состояния. Метод MDB onMessage получает домашний интерфейс сессионного компонента без сохранения состояния и вызывает метод create() домашнего интерфейса, чтобы получить сам фактический сессионный компонент без сохранения состояния.

Код не пытается кешировать сессионный компонент, просто использует его напрямую:

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

В MDB нет соответствующего вызова remove().

У меня вопрос: не плохо ли в этом случае звонить remove()?

Я вполне уверен, что нужно вызвать remove() для состояния ful сессионный компонент, но мне менее понятно, необходим ли вызов remove() для состояния меньше .

Недавно мы значительно улучшили производительность, но внезапно начали исчерпывать сессионные компоненты с состоянием под нагрузкой, за исключением:

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>

Наш пул сессионных компонентов без сохранения состояния имеет значение:

<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>

У меня вопрос: MDB, который вызывает create() для сессионного компонента без состояния, также отвечает за вызов remove() для состояния минус сессионный компонент? (Похоже, что приложение работало годами без вызова remove(), но мне интересно, обнаружила ли повышенная пропускная способность старую ошибку.)

1 Ответ

0 голосов
/ 29 апреля 2009

Метод remove () будет вызван в любом случае после создания объекта удаленного интерфейса. Я думаю, что ни одно EJB-приложение не должно обязывать явно вызывать методы remove (), если это происходит, возможно, потому, что пул слишком мал. Конечно, вы звоните всегда, используя для тонкой настройки, но это должно быть исключением, а не правилом.

...