6

仕様によると、スコープのコンテキストが破棄されようとしているときに、CDIコンテナがSFSBを削除します。どのようにしてEJBを正確に削除しますか?@Removeで注​​釈が付けられたメソッドを呼び出していないようです。

@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コンテナにインスタンスを削除するようにどのように要求するかです。ありがとう。

4

3 に答える 3

3

CDIコンテナには、EJBコンテナへのフックが必要であり、「@Removeメソッドが完了した場合に実行することを実行する」ように要求されると思います。EJB仕様を見ると、EJB 2.1には、拡張する必要のあるインターフェースにこのためのメカニズムがありました。

明らかな理由から、副作用のために任意の@Remove注釈付きメソッドを呼び出すコンテナーはかなりお勧めできません。

于 2012-05-03T23:13:08.263 に答える
2

コベナーが言うように、これは、EJB標準APIの一部ではない実装固有のEJBAPIを使用して行われます。

コベナーが言うように、@Removeを呼び出すことは続行する正しい方法ではありません。@Removeメソッドはユーザーコードによって呼び出され、EJBコンテナにEJBを削除するように指示します。EJBが削除されたときにコールバックが必要な場合は、@PreDestroyを使用します。

于 2012-10-01T19:32:15.410 に答える
-1

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

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

于 2012-05-02T19:57:30.357 に答える