2016-09-01 13 views
1

シングルトンのpreDestroyメソッドでステートレスEJBにアクセスする際に問題があります。アプリケーション・サーバーのシャットダウンをデータベース・テーブルに記録する必要があります。シングルトンのPreDestroyメソッドでステートレスEJBにアクセスする

これは、シングルトンは、次のようになります。

@Stateless 
public class TableFacade { 

... 

    public TestEntity find(String test) { 
     Query query =  
     getEntityManager().createNamedQuery("TestEntity.namedQuery"); 
     return (TestEntity) query.getSingleResult(); 
    } 
} 

サーバーがシャットダウンされている場合は、preDestroyメソッドにアクセスすると、EJBメソッド:

@Startup 
    @Singleton 
    public class ServerShutdown { 

    @EJB 
    TableFacade tableFacade; 

    @PreDestroy 
    private void shutdown() { 
     TestEntity e = tableFacade.find("test"); 
     //do something 

    } 
    } 

ここでステートレス豆のサンプルコードがありますが呼び出されます。しかし、呼び出し中、サーバーはシャットダウンプロセスを強制し、EJBメソッドの呼び出しをキャンセルします。

私はJava EE 6、JDK 1.8、EJB 3.1、eclipselink 2.5.2を使用しています。事前に

おかげ

+0

Errrrとあなたの問題は....? –

+0

追加されました。ごめんなさい。 ;) –

答えて

1

@predestroyだけ...な変数などの接続、として、EJBリソースのクリーンアップを行う必要があります

あなたの問題は、スペックからトランザクションコンテキスト、Infactは関係してい

ステートレス およびステートフルセッションBeanのPreDestroyライフサイクルコールバックインターセプタメソッドは、指定されていないトランザクション コンテキストで実行されます。

そして:たとえば

、 ステートフルセッションBeanのPostConstructまたはPreDestroyライフサイクルコールバック内 インターセプタメソッドをデータベース操作を実行すると、操作はの一部であると仮定することは間違っているだろう クライアントの取引。 のPostConstructメソッドとPreDestroyメソッドは、 トランザクション属性によって制御されません。これらのメソッド のロールバックを処理すると、セッションインスタンスの状態図が大きく複雑になるためです。

したがって、明示的に禁止されていませんが、状況が間違っている可能性があるという警告が表示されます。

+0

ありがとう!それはたくさん説明しました! –

関連する問題