イベント

イベントの発生と、イベント監視が簡単に行えるのもWeb Beansの強みだ。非常に簡単にPub/Subタイプのメッセージングを構築できる。

ただし、この機能はJBoss COMPASSで発表された内容と、EDR版の仕様では大きく異なっている。ここでは、JBoss COMPASSで発表された内容を元に解説を行う。

まず、イベントを発生させる側では、@Observableアノテーションを付与したEventオブジェクトをコンテナからインジェクトしてもらう。

リスト30

    @Component
    public class UserRegisterAction {

      @Observable Event userRegisterEvent;

      public void register(User user) {
        ...
        // イベント発生!
        userRegisterEvent.fire(user);
      }
    }

イベントオブジェクトのfire()メソッドを呼び出すと、イベントが発生する。そのイベントを受信する側は、引数に@Observesを付与したメソッドを用意しておく。すると、インジェクト時と同様に、型やバインディングタイプに応じてイベントハンドラがコンテナに登録され、イベント発生時に呼び出しが行われる。

リスト31

    @Component
    public class UserEntityEvent {
      // イベントハンドラ
      public void handleEvent(@Observes User user) {
        log.debug(user.getName() + " is created or updated");
      }
    }

たとえば以下のように、バインディングタイプでイベントを絞り込むことが可能だ。

リスト32

    @Component
    public class UserRegisterAction {

      @Observable @Register Event userRegisterEvent;

      public void register(User user) {
        ...
        // イベント発生!
        userRegisterEvent.fire(user);
      }
    }

    @Component
    public class UserEntityEvent {
      // イベントハンドラ
      public void onRegister(@Observes @Register User user) {
        log.debug(user.getName() + " is created.");
      }
    }