2009-04-03 4 views
1

세월이 지난 WebLogic J2EE 애플리케이션은 Stateless Session Bean을 사용하는 메시지 구동 Bean을 가지고 있습니다. MDB onMessage 메소드는 상태 비 저장 세션 빈의 홈 인터페이스를 가져오고 홈 인터페이스의 create() 메소드를 호출하여 실제 비 상태 세션 빈을 가져옵니다.스테이트리스 세션 빈을 사용한 후에 MDB 호출 remove()를 수행해야합니까?

코드는 직접 사용, 세션 빈을 캐시하지 않습니다

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

는 MDB에 해당하는 제거() 호출이 없습니다.

제 질문은이 경우 remove()를 호출하지 않는 것이 좋습니까?

나는 하나가 상태 FUL 세션 빈에 대한() 제거를 호출 할 필요가 있음을 상당히 확신하지만, 제거() 호출 상태 적은에 필요한 경우 나 덜 분명하다.

우리는 최근 상당한 성능 향상을했지만 갑자기이 예외와 부하 상태 세션 빈에서 실행하기 시작

java.lang.RuntimeException가 : 에서는 MyApplication, EJBComponent : EJB MyMessageDrivenBean (응용 프로그램의 호출하여 MyApplication을 .jar)은 사용 가능한 풀에서 인스턴스를 가져 오기 위해 대기하는 동안 시간이 초과되었습니다. weblogic.ejb20.pool.StatelessSessionPool.waitForBean (StatelessSessionPool.java:229) weblogic.ejb20.manager.StatelessManager.preInvoke에서 weblogic.ejb20.pool.StatelessSessionPool.getBean (StatelessSessionPool.java:100) 에서 (StatelessManager에서 . 자바 : weblogic.ejb20.internal.BaseEJBLocalObject.preInvoke (BaseEJBLocalObject.java:228 140) ) weblogic.ejb20.internal.StatelessEJBLocalObject.preInvoke (StatelessEJBLocalObject.java:53에서 ) MyMessageDrivenBean_x56omo_ELOImpl.processMessage (MyMessageDrivenBean_x56omo_ELOImpl.java에서 : 28) weblogic.ejb20.internal.MDListener.execute (MDListener.java:370) 에서 MyMessageDrivenBean.onMessage (TBMessageListener.java:94) 에서 weblogic.ejb20.internal.MDListener.onM에서

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

우리의 무 상태 세션 빈 풀이 : weblogic.jms.client.JMSSession.onMessage에서 essage (MDListener.java:262) (JMSSession.java:2678)

우리의 MDB 풀로 설정 설정 :

<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()인가? (이 애플리케이션은 remove()를 호출하지 않고 수년간 실행 한 것으로 보이지만 향상된 처리량으로 인해 오래된 버그가 노출되었는지 궁금합니다.)

답변

0

원격 인터페이스 객체가 garbaged 된 후에 remove() 메소드가 호출됩니다. . EJB 응용 프로그램이 명시 적으로 remove() 메서드를 호출해야한다고 생각하지 않습니다. 그렇다면 풀이 너무 작아서입니다. 물론 미세 조정을 위해 항상 호출하는 것이지만 이는 예외가 아니라 규칙이어야합니다.

관련 문제