2017-06-16 8 views
0

CDI 2.0でcan fire an event asynchronouslyを呼び出してEvent.fireAsync()と呼び出してから、@ObservesAsync注釈付きリスナーでこのイベントを聞きます。なぜEvent.fireAsync()リクエスタが@ObservesAsyncアノテーションを使用するのですか?

Event.firesAsync()@ObservesAsyncの両方が必要な理由

  • できませんでしたCDI 2.0プロセスは、非同期イベントがEvent.fire()で焼成し、@ObservesAsyncでキャッチ?
  • 逆に、CDI 2.0で非同期的に処理されたイベントは、Event.fireAsync()とのcauguthで処理できませんでしたか?

答えて

3

本当に良い質問ですが、ここで少しの洞察があります。

CDI EG(専門家グループ)は、いくつかの理由のためにこれら二つを混合に対し決定:

  • 下位互換性を
    • 既存のアプリケーションは、同期を使用して、同じ注釈を維持等しく
    • を動作するようになる必要がありますとにかく差別化のために余分なオプションを追加する必要があります
  • 戻り値を呼び出す
    • はあなたにこれが自然の非同期プログラミングモデルに適合exceptionally()またはthenApply()などとすることができますチェーンの次のステップへCompletionStageを与えます。唯一
    • 古き良きEvent.fire()あなたは全く反応できないためにどの、あなたにvoidを与える - 非同期
    • のためによくないと再度、同期1の戻り値は異なり取り扱い除きにより、下位互換性
  • に変更することはできませんたくさん
    • 例外チェーンの同期通知==最後に、あなたは非同期通知に
    • 例外を爆破==あなたはオブザーバーメソッド(おそらく複数のスレッドから)からすべての例外を収集し続け、呼び出し元のコードにそれらを提示します。それはCompletionStageなので、簡単にそれに反応することができます。
    • この2つを混ぜると、ユーザー側で非常に混乱する結果になります。いつ吹き飛ばし、いつ続けるのですか?Event.fire()の本当の成果は
  • 内部オブザーバ処理
    • (それは同様の非同期のためだったら)同期と非同期
    • を混合するために(それも可能だろうと仮定して)非常に複雑になるとは何ですか
    • コンテキストが他のスレッドで伝播しないように、同期と非同期の間の線を厳密に描画する必要があることを覚えておいてください(例えば、RequestScopedをWeldが非同期オブザーバスレッドで再起動する必要があります)
    • 同様の問題は、セキュリティコンテキストの伝播fまたはインテグレータ
    • あなたはそれが
  • のために使用されるかを知ることはありませんようがあり、それは本当に速い動作させるために、多くの場合、オブザーバーの前処理であるあなたは、両方のための1つのオブザーバメソッドを持っている場合、あなたが本当に前処理、それすることができます私は考えることができる現行モデルの

その他の利点:fireAsync()

  • プレゼンスは、追加オプション
      でイベントを発生することができます0
    • そこがそのように、あなたの通知
    • のExecutorを指定することができNotificationOptionsこれはまた、実装に多くの火力を与えると呼ばれている - 溶接は、すでに少なくとも最後にではなく、これらのオプションを使用してparallel execution and timeouts
  • を提供しています - ユーザーエクスペリエンス を
    • それはあなたが正確に
    • 同じで、その作品は fireAsync()のためにあなたが @ObservesAsyncに一致している前に持っていたものということは明らかである。この方法
+0

これは非常に良い点です!私は確かに決定のより良い理解を持っています。ありがとうございました! – brandizzi

関連する問題