[Java] Asynchronous CDI Events?

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/asynchronous_cdi_events

CDIイベントは非常に強力な機能で、非常にシンプルで型安全な方法で疎結合にすることができます。CDIイベントは、非同期というよりはむしろ同期型である、という側面があり、このことに驚かれる方が結構いらっしゃいます。イベントシステムが通常は非同期である、ということを考えれば、その驚きは当然と言えるでしょう。Piotr Nowickiが、EJBの@AsynchronousアノテーションやSingletonロック、JMSなどのプレーンなJava EEの機能を使用して、CDIイベントを非同期にするための様々なオプションを調査し、ブログエントリにまとめ、その中で問題を調べています。
Asynchronous CDI Events
http://www.javacodegeeks.com/2013/05/asynchronous-cdi-events.html
node.jsやリアクティブ・プログラミングが徐々に発展しているため、この問題をさらに深掘りすることはきっと時宜に適っていると思います。
非常に心強いことに、CDI 2.0のスペックリードであるAntoine Sabot-Durand自身が、自身のCDI 2ウィッシュリストで、非同期CDIイベントについて述べており、@Observes アノテーションへの非同期フラグを追加することを提案しています。
Forward CDI 2.0 (Next Presso)
http://www.next-presso.com/2014/03/forward-cdi-2-0/
この提案における、考えられる不都合な点は、イベントプロデューサではなく、イベントコンシューマが非同期を使うことを決定する、という点です。もう一つの可能性は、Java SE 8で導入されたアノテーション機能を使って、プロデューサに非同期マーカーを付けることです。
public class EventProducer {

  @Inject Event event;

  public void doSomething() {
      MyEvent e = new @Async MyEvent();
      e.data = "This is a test event";
      e.eventTime = new Date();
      event.fire(e);       
  }   
}

public class EventConsumer {

    public void afterMyEvent(@Observes MyEvent event) {
        // .. Insert event logic here
    }
}
この問題と可能性についてどう思いますか?そろそろ、CDI 2の将来がはっきりしてきたと、合図を出す時期ですね。

0 件のコメント:

コメントを投稿