2009-04-03 4 views
1

古いWebLogic J2EEアプリケーションには、ステートレスセッションBeanを使用するメッセージドリブンBeanがあります。 MDB onMessageメソッドは、ステートレスセッションBeanのホームインタフェースを取得し、ホームインタフェースのcreate()メソッドを呼び出して、実際のステートレスセッションBean自体を取得します。ステートレスセッションBeanを使用した後にMDBコールremove()を行う必要がありますか?

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

MDB内に対応するのremove()の呼び出しはありません。

コードはちょうどそれを直接使用して、セッションBeanをキャッシュしようとしません。

私の質問です:この場合はremove()を呼び出さないのが悪いですか?

は、私は1つが状態FULセッションBeanのremove()を呼び出すために必要であることをかなり確信しているが、削除()呼び出しは状態少ないのために必要であれば、それは私にはあまり明らかです。

我々は最近、大幅なパフォーマンス向上をしたが、突然、この例外に負荷の下で、ステートフルセッションBeanが不足し始めた:

java.lang.RuntimeException:EJB MyMessageDrivenBeanの呼び出し(応用: MyApplicationを、はEJBComponent:MyApplicationという.jar)は、空きプールからインスタンスを取得するのを待つ間にタイムアウトしました。 weblogic.ejb20.pool.StatelessSessionPool.waitForBean(StatelessSessionPool.java:229)weblogic.ejb20.manager.StatelessManager.preInvokeでweblogic.ejb20.pool.StatelessSessionPool.getBean(StatelessSessionPool.java:100) で(StatelessManagerで 。 :ジャワ:MyMessageDrivenBean_x56omo_ELOImpl.processMessageでweblogic.ejb20.internal.StatelessEJBLocalObject.preInvoke(StatelessEJBLocalObject.java:53) (MyMessageDrivenBean_x56omo_ELOImpl.javaでweblogic.ejb20.internal.BaseEJBLocalObject.preInvoke(BaseEJBLocalObject.java:228) における140) 28) at MyMessageDrivenBean.onMessage(TBMessageListener.java:94) weblogic.ejb20.internal.MDListener.execute(MDListener.java:370) weblogic.ejb20.internal.MDListener.onM weblogic.jms.client.JMSSession.onMessageでessage(MDListener.java:262) (JMSSession.java:2678)

当社のMDBプールに設定されています。私たちのステートレスセッションBeanのプールがある

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

私の質問があり、同様の状態のために少ないセッションBeanを削除()を呼び出すためにも責任がステートレスセッションBeanの作成呼び出し、MDB()ですか? (アプリケーションはremove()を呼び出さずに何年も実行されているようですが、改善されたスループットが古いバグを露呈しているかどうかは疑問です)

答えて

0

リモートインターフェイスオブジェクトがgarbagedされた後。 私は、EJBアプリケーションが明示的にremove()メソッドを呼び出すことを義務づけてはいけないと思います。もしそうなら、おそらくプールが小さすぎるからです。もちろん、微調整のために常に使用することを呼び出しますが、これはルールではなく例外でなければなりません。

関連する問題