2012-05-01 22 views
6

スコープのコンテキストが破棄されようとしているとき、CDIコンテナはSFSBを削除します。どのようにEJBを完全に削除するのですか? @Removeでアノテーションされたメソッドを呼び出すようではありません。CDIはどのようにステートフルセッションBeanを削除しますか?

@Stateful 
public class CustomerDAOImpl implements CustomerDAO { 
    @PreDestroy 
    public void onDestroy() { 
     //This is getting called as expected 
    } 
    @Remove 
    public void deleteMyBean() { 
     //This is not getting called! 
    } 
} 

したがって、CDIは技術的にスペックが述べていることを行っています。問題は、EJBコンテナにインスタンスを削除するように依頼することです。ありがとう。

答えて

2

covenerは、これは実装固有のEJB APIを使用して行われ、EJB標準APIの一部ではないと述べています。

covenerが言うように、@Removeを呼び出すのがではなく、正しい方法です。 @Removeメソッドはユーザコードによって呼び出され、はEJBコンテナにと言ってEJBを削除します。 EJBが削除されたときにコールバックが必要な場合は、@PreDestroyを使用します。

-1

@Removeアノテーションのメソッドは、クライアントによって明示的に呼び出されなければなりません。そして、コンテナは暗黙のうちに@PreDestroyというアノテーションが付けられたメソッドを呼び出します。その後、Beanインスタンスはガベージコレクションの準備が整います。

これは、クライアントが制御できる唯一のライフサイクルメソッドであり、他のすべてのメソッドはコンテナによって制御されます。

+0

はい、これは正常な動作です。しかし、CDIコンテナはEJBをどのように削除していますか? EJBコンテナに削除を実行するように要求するには、文書化されていないAPIを使用していますか? – RajV

+0

@RajV私は仕様で見つけられませんでしたが、Java EEチュートリアルの「ステートフルセッションBeanのライフサイクル」http://docs.oracle.com/javaee/5で役に立つ情報を見つけることができます/itutorial/doc/bnbmt.html –

+0

@downvoter -1 –

3

私は、CDIコンテナがEJBコンテナに「@ Removeメソッドが完了したばかりのことをやってください」と尋ねるフックが必要だと思います。 EJB仕様を見ると、EJB 2.1にはこれを拡張するためのインタフェースが用意されていました。

明白な理由から、コンテナは、副作用のために任意の@Remove注釈付きメソッドを呼び出すことはかなり嫌です。

+0

+1について説明するが、コンテナはEJBObject(これは基本的にCDIが使用したいものである)を実装しているが、 BeanはSessionBeanを実装します。 –

+0

これは答えではなく、推測です。実際にそのようなフックがあった場合、ベンダー固有のものになります。 Weldのような実装は、どのようにして一般的な方法でそれを行うことができますか? – RajV

+0

溶接はどのように移植可能かという疑問はありません。 Weldは特に、Containerがインターフェースのあらゆる種類の実装を提供することを要求します。SessionObjectReference#remove – covener

関連する問題