プロジェクト

全般

プロフィール

Guava EventBus

イベントライブラリの中では比較的少ない機能と実装で扱いは容易です。

入手

公式サイト
https://github.com/google/guava

バイナリは、Mavenリポジトリより(18.0のリリースページにMavenリポジトリへのリンクあり)
https://github.com/google/guava/wiki/Release18

サンプル

最初のサンプル(Hello world)

イベントバス・インスタンスの生成(同期)

同期で処理されるイベントバス・インスタンスを生成します。このイベントバスにpostしたスレッドで逐次registerしたsubscriberを呼び出します。

EventBus bus = new EventBus("global-bus");

イベントの購読(Subscribe)クラスの定義と購読登録

イベントバスにsubscribeするクラスは呼び出してもらうメソッドにアノテーション@Subscribeを付与します。引数はイベントの型でpostした型と一致(代入可能)する場合に呼ばれます。

public class HelloGuava {
    @Subscribe
    public void receive(String event) {
        System.out.println("receive: thread=" + Thread.currentThread().getName());
    }
}

イベントバスに@Subscribeメソッドを持つクラスのインスタンスを購読登録します。

HelloGuava hello = new HelloGuava();
bus.register(hello);
  • 注意)ここで購読登録したインスタンスはイベントバスに強参照で保持されるので、不要になったときはunregisterしないとメモリリークになります。

イベントの発行

bus.post("Hello, Guava");

非同期のサンプル(JavaFXスレッド)

いろいろなスレッドでpostを行い、subscriberを呼び出すスレッドをJavaFXアプリケーションスレッドに限定するサンプルを記述します。

イベントバス・インスタンスの生成(非同期)

EventBus fxBus = new AsyncEventBus("javafx-eventbus", r -> Platform.runLater(r));
  • 非同期の場合、subscriberを呼び出すスレッドをExecutorで指定します。

その他

  • イベントの購読(Subscribe)クラスの定義と購読登録
  • イベントの発行

については最初のサンプルとやり方は一緒です。

イベントの型による振り分け

イベントバスは、postしたインスタンスの型と互換性のあるsubscriberを呼び出します。型に互換性がなければpostしても呼び出されません。