2011-12-05 5 views
15

CDIを使用してバックエンドサービスを実装することを試しています。このシナリオは次のとおりです。CDIアプリケーションと依存スコープは、ガベージコレクションに影響を与えると共謀できますか?

@StartupのEJBは、EARがデプロイされたときに開始されます。 ApplicationScoped Beanは、この上に注入される:

@ApplicationScoped 
public class JobPlatform { 

    private PooledExecutor threadHolder; 

    @Inject @Any 
    private Instance<Worker> workerSource; 
... 

豆は、イベントが観察される場合、インスタンスworkerSourceからワーカーBeanを取得し、それが最終的に実行スレッドプール、上にそれを置く、オブザーバー方法を有します完了まで

すべてうまく動作します。しかし、私たちはガベージコレクションの問題を見始めました。 JMAPヒープのヒストグラムには、これらのワーカーがぶら下がっていて、ガベージコレクションされていないことがわかります。

私たちは、これがCDIスコープの組み合わせにあると考えています。 @DependantのAPIページ(http://docs.jboss.org/cdi/api/1.0-SP1/javax/enterprise/context/Dependent.html)がドキュメントには何より明確補強:

  • フィールドに注入スコープ@DependentとBeanのインスタンス、豆コンストラクタまたは初期化方法は、依存対象でありますBeanまたはJava EEコンポーネント・クラス・インスタンスに挿入します。
  • プロデューサメソッドにスコープ@Dependentを挿入したBeanのインスタンスは、生成されるプロデューサメソッドBeanインスタンスの依存オブジェクトです。
  • インスタンスの直接呼び出しによって取得されたスコープ@Dependentを持つBeanのインスタンスは、インスタンスのインスタンスの依存オブジェクトです。

ので、以下の本:

workerSource BeanがJobPlatformにバインドされ、そのため、
  • どれワーカー豆はそれにバインドされ、そのインスタンスを使用して取得ApplicationScoped寿命を持ってい
    • としたがって、ApplicationScopedの存続期間がある
    • ApplicationScopedコンテキストのBeanストア(用語についての私の知識はここで少しぼんやりしています)は、労働者の豆と一緒に、彼らは破壊されていない/ごみの収集

    CDIを使用する人はこれに同意しますか?このガベージコレクションの不足を経験したことがありますか?あれば、回避策を提案できますか?

    ワーカーはApplicationScopedにすることはできませんが、プラットフォームは必須です。カスタムWorkerScope(uh ohhh ...)を作成して各ワーカークラスに注釈を付けるとすれば、それはワーカーとインスタンスソースの間の依存関係を分離するのに十分でしょうか?

    Is it possible to destroy a CDI scope?にもいくつかの提案がありますが、有効な理由のようにスコープが見えるかどうかについてのバックアップが必要でした。

    ご協力いただきありがとうございます。

  • 答えて

    9

    ご理解の方が正しいです。これは仕様の見落としであり、CDI 1.1で修正される予定です。 Instanceは、SessionScopedApplicationScopedなどの長時間実行中のスコープで使用されたときと同じように、メモリリークを起こす可能性があります。あなたがする必要があるのは、インスタンスのためのContextualまたはBeanのホールドを取得し、それをそのように破壊することです。

    メモリリークを避けるために、BeanManagerメソッドを使用してインスタンスを作成するのが最良です(この方法で、Beanにハンドルがあり、破壊する可能性があります)。 Instance

    +0

    非常に早く戻ってくれてありがとうございます。認識されていることを知ってうれしいです問題。回避策を今すぐ実行します!乾杯! –

    +0

    Weld 1.1はCDI 1.0ではなく、CDI 1.0を実装しています。 –

    +0

    Craigを修正してください。 Weld 2.0はCDI 1.1を実装しています(ええ、番号付けが奇妙です)。 CDI 1.1がどのようなものになるか見たい場合は、Weld 2.0を試してみてください。 Weld 2.0を含むJBoss AS7の特別なビルドがあると私は信じています。 – LightGuard

    2

    ジェイソンの提案回避策を実装するに見ながら、私はこの問題に関連するいくつかのより多くのリソースが見つかりました:

    問題:https://issues.jboss.org/browse/CDI-139https://issues.jboss.org/browse/WELD-920

    例beanManager操作: https://issues.jboss.org/browse/CDI-14?focusedCommentId=12601344&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-12601344

    または org.jboss.seam.faces.util.BeanManagerUtils

    関連する問題