私は現在、guice-servletを使用するようにセットアップした製品に取り組んでいます。
受け取ったリクエストごとに、一連のワーカー スレッドを生成し、それぞれが「タスク」を実行します。次に、これらのタスクの結果がマージされて、応答が生成されます。
これはかなり一般的/簡単ですが、Guice との結婚を試みたことはありません。残念ながら、事前にグラフ全体を描画する必要がある状況に陥ってしまいました。
つまり、子スレッド内で遅延バインディングを実行することはできません。これは、存在しないリクエスト/セッション スコープのものを使用しようとするためです。
相互に関連するいくつかの質問:
1)タスク スレッド内からリクエスト スコープのオブジェクトにアクセスできると非常に便利です。私は最初ServletScopes.transferRequest()に誘惑されました (そして遊んでみました)が、次のように収縮しました:
通常、リクエスト スコープのオブジェクトはスレッド セーフではないため、現在のリクエスト スコープが終了するまで、このメソッドによって返される callable を別のスレッドで実行してはなりません。返された callable は、現在のスレッドがリクエスト スコープを解放するまでブロックされます。
これは、別のスレッドで後処理する (つまり、応答後に何らかの作業を行う) ためのものであり、スレッドセーフに関する懸念は有効です。
これを処理する Guicy™ の方法は、タスクのみのもの用の別のモジュールを使用して子インジェクターを作成し、要求スコープからの要求/不変のものをシードすることですか?
これを読み返すと、少しぎこちなく/重いように見えるので、おそらく間違っています。
2)ご想像のとおり、ワーカー スレッド用のカスタム タスク スコープを作成すると便利です。
ServletScopes.transferRequest ()を誤っていじっていたときに何かが機能していましたが、CustomScopesページではカスタムスコープを作成しないようにアドバイスしています:
一般に、ユーザーが独自のカスタム スコープを作成しないことをお勧めします。ほとんどのアプリケーションでは、組み込みのスコープで十分です。
タスクスレッド内で物事をスコープするためのより良いアプローチはありますか?
前もって感謝します!!