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コンテキストのBeanストア(用語についての私の知識はここで少しぼんやりしています)は、労働者の豆と一緒に、彼らは破壊されていない/ごみの収集
CDIを使用する人はこれに同意しますか?このガベージコレクションの不足を経験したことがありますか?あれば、回避策を提案できますか?
ワーカーはApplicationScopedにすることはできませんが、プラットフォームは必須です。カスタムWorkerScope(uh ohhh ...)を作成して各ワーカークラスに注釈を付けるとすれば、それはワーカーとインスタンスソースの間の依存関係を分離するのに十分でしょうか?
Is it possible to destroy a CDI scope?にもいくつかの提案がありますが、有効な理由のようにスコープが見えるかどうかについてのバックアップが必要でした。
ご協力いただきありがとうございます。
非常に早く戻ってくれてありがとうございます。認識されていることを知ってうれしいです問題。回避策を今すぐ実行します!乾杯! –
Weld 1.1はCDI 1.0ではなく、CDI 1.0を実装しています。 –
Craigを修正してください。 Weld 2.0はCDI 1.1を実装しています(ええ、番号付けが奇妙です)。 CDI 1.1がどのようなものになるか見たい場合は、Weld 2.0を試してみてください。 Weld 2.0を含むJBoss AS7の特別なビルドがあると私は信じています。 – LightGuard