覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

MBassador - 軽量なhigh-performance Event Bus

JavaでPublish/Subscribe Patternをベースにした軽量なEventBusのライブラリとしてMBassadorというものが存在しています。


今回のサンプルではとりあえずHelloWorld的なことをやります。

準備

pom.xmlに以下の依存関係を追加します。本エントリではversionには"1.3.0"を指定しました

<dependency>
    <groupId>net.engio</groupId>
    <artifactId>mbassador</artifactId>
    <version>{mbassador-version}</version>
</dependency>


使い方の概要

  1. メッセージを購読するためのHandler(Listner)を定義する。

  2. EventBusを生成して、定義したHandlerをsubscribeする

  3. EventBusに対してメッセージを発行(送信)する。


これで、発行したメッセージをHandler側で購読する(受け取る)ことができます


サンプル

■Handlerの定義

Handler用のクラスを作成して、メッセージを受け取るためのメソッドを定義します。
そしてそのメソッドに@Handler(net.engio.mbassy.listener.Handler)アノテーションを付与します。

import net.engio.mbassy.listener.Handler;

class SimpleMsgListener {

    @Handler
    public void handle(String msg) {
        System.out.println(Thread.currentThread().getName() + " : " + msg);

        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

■EventBus生成・Handlerのsubscribe・メッセージ発行

以下サンプルでは、EventBus生成・Handlerのsubscribe・メッセージ発行を行っています。

  • MBassadorのインスタンス生成 ⇒ EventBusの生成
  • 先に定義したHandlerを引数に指定して、MBassador#subscribeを実行 ⇒ Handlerのsubscribe
  • MBassador#publishAsyncMBassador#publish)の実行 ⇒ メッセージ発行
import net.engio.mbassy.bus.MBassador;


public class SampleLauncher {

    public static void main(String[] args) {

        System.out.println(">>> App start");

        MBassador eventBus = new MBassador();
        SimpleMsgListener listener = new SimpleMsgListener();
        eventBus.subscribe(listener);    // ハンドラの登録


        // 同期型でメッセージ送信
        for (int i = 0; i < 5; i++) {
            eventBus.publish("msg-A-" + i + " Hello, World");
        }

        System.out.println("\n>>> MBassador#publish end.");

        // 非同期型でメッセージ送信
        for (int i = 0; i < 5; i++) {
            eventBus.publishAsync("msg-B-" + i + " Hello, World");
        }

        System.out.println("\n>>> MBassador#publishAsync end.");

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("\n>>> App end");
    }
}

■実行結果

>>> App start
main :: SimpleMsgListener#handle: msg-A-0 Hello, World
main :: SimpleMsgListener#handle: msg-A-1 Hello, World
main :: SimpleMsgListener#handle: msg-A-2 Hello, World
main :: SimpleMsgListener#handle: msg-A-3 Hello, World
main :: SimpleMsgListener#handle: msg-A-4 Hello, World

>>> MBassador#publish end.

>>> MBassador#publishAsync end.
MsgDispatcher-0 :: SimpleMsgListener#handle: msg-B-0 Hello, World
MsgDispatcher-1 :: SimpleMsgListener#handle: msg-B-1 Hello, World
MsgDispatcher-1 :: SimpleMsgListener#handle: msg-B-2 Hello, World
MsgDispatcher-0 :: SimpleMsgListener#handle: msg-B-3 Hello, World
MsgDispatcher-1 :: SimpleMsgListener#handle: msg-B-4 Hello, World

>>> App end

発行されたメッセージをSimpleMsgListener#handlerが処理していることが分かります。
また、MBassador#publishで発行されたメッセージは同期型で処理されて、MBassador#publishAsyncで発行されたメッセージは非同期で処理されていることも分かります。


まとめ

MBassadorは、簡単にEventBusとして利用することができることが分かりました。
本エントリではかなり単純なメッセ―ジを送る事しかしませんでしが、もっと色々できますので後々紹介できればと思います。



関連エントリ