2

(guice メーリング リストに x-posted)

私は、既存のアプリケーションに組み込まれる新しいライブラリで Guice を試しています。現在、私たちのアプリはすべてSpringアプリであり、主に使用する傾向があるスレッドモデルに関係する、Springに関連付けられたいくつかの共通コードがあります. それは基本的に、論理スレッド (と見なされるもの) を提供します。

そのため、ジョブを投げることができ、特定のキーを持つジョブが、送信された順序で常に同じパイプに到達することが保証されます。通常、これはアプリケーションの存続期間中 1 つのスレッドですが、問題が発生した場合はワーカー スレッド (パイプをバックアップする) が破棄され、パイプが非アクティブ化され、新しいワーカーが作成され、そのワーカーでパイプが再アクティブ化されます。ここのすべての配線はスプリングによって提供されます。

私の新しいライブラリはこれをスレッドモデルに使用する必要があり、ロジックとドメイン側、つまりパイプラインで進行する作業とそれが表すロジックを構築するために Guice を使用する予定です。これは、「パイプ」(論理スレッドとも呼ばれる) スコープで特定のものを注入したいという、非常に危険に思える 1 つのことを除いて、私には非常に簡単に思えます。カスタム スコープ (および SimpleScope の実装) の wiki ページを読みましたが、いくつかの点が明確ではなく、明確化していただければ幸いです...

  1. パイプはJVMの存続期間中存続するため、スコープに入る必要があるようですが、決して終了しないようです。これの欠点はありますか?
  2. Spring マネージド Bean でスコープ エントリをトリガーするには、どのようなオプションがありますか? 春のコンテキストを作成し、SpringIntegration を使用して春の Bean を guice コンテキストに吸い込むだけの場合ですか?
  3. これは本当に不安定に聞こえますか?代わりに、パイプ ID をキーとするシングルトンでラップする必要がありますか?

乾杯マット

4

1 に答える 1

0

私は機能するものを実装しましたが、少し醜いセットアップが含まれています...これの改善にまだ興味があり、実際に投稿するにはコードが少し多すぎる可能性があるので、うまくいけば光るスニペットをいくつか入れてください

これは、SimpleScopeの例のバリエーションです。

  • 春のctxを育てる
  • そこから特定のBeanを取得する(つまり、パイプラインキーのレジストリ)
  • それをBeanfactoryと一緒にGuiceモジュールに渡します
  • そのレジストリをScopeimplに指定して、パイプがアクティブ化されたときにスコープが入力されるようにします(これは、後で特定のSpring Beanが初期化されたときに発生します)。

Scopeインスタンスがモジュール内で新しく作成されたため、BeanfactoryでbindAllを実行した後、Namedを介して特定のBeanにアクセスするのではなく、特定のBeanを取得する必要があるようです。

    PipeScope<SecurityId> pipeScope = new PipeScope<SecurityId>();
    pipeScope.setPipeIdRegistry(pipeIdRegistry);
    bindScope(Pipe.class, pipeScope);
    bind(PipeScope.class)
            .annotatedWith(Names.named("pipeScope"))
            .toInstance(pipeScope);
    SpringIntegration.bindAll(binder(), beanFactory);

私が新しくしなければならないという事実は、モジュールにレジストリを明示的に提供する必要があることを意味します。これは鶏と卵の状況であるため、これを回避する方法を見つけることができません。

PipeScopeは基本的に、ThreadLocalではなくパイプキー(実際にはキーのリスト)に対して値を格納するので、私の入力は次のようになります。

public void enter(List<K> scopedKeys) {
    checkState(values.get(scopedKeys) == null, "A scoping block is already in progress");
    values.put(scopedKeys, Maps.<Key<?>, Object>newHashMap());
}

全体として、完全にうまく機能しているようです...少なくとも私のすぐにノックアップされたテストハーネスではとにかく

于 2009-07-03T19:25:25.077 に答える