覚えたら書く

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

MBassador - Handlerの引数の型に合わせてメッセージが届く

以前のエントリでJava用の軽量なEventBusとして、MBassadorを紹介しました。


その際にはメッセージを受け取るハンドラを一つだけ定義しましたが、今回のサンプルでは複数のハンドラを定義してみます


■Handlerの定義

ハンドラとなるメソッドを3つ用意しました

  • SimpleMsgListener#handle1 ・・・ String型のメッセージを受け取るハンドラ
  • SimpleMsgListener#handle2 ・・・ String型のメッセージを受け取るハンドラ
  • SimpleMsgListener#handle3 ・・・ LocalDate型のメッセージを受け取るハンドラ
import net.engio.mbassy.listener.Handler;
import java.time.LocalDate;

class SimpleMsgListener {

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

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

    }

    @Handler
    public void handle3(LocalDate date) {
        System.out.println("handler3::" + Thread.currentThread().getName() + " : " + date);
    }

}


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

EventBus生成・Handlerのsubscribe・メッセージ発行を行います。
本サンプルでは、String型のメッセージとLocalDateの値をEventBusに発行します。

import net.engio.mbassy.bus.MBassador;
import java.time.LocalDate;


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 < 3; i++) {
            eventBus.publishAsync("msg-" + i + " Hello, World");
        }

        for (int i = 0; i < 3; i++) {
            LocalDate localDate = LocalDate.now().plusDays(i);
            eventBus.publishAsync(localDate);
        }

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

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


■実行結果

>>> App start
handler2::MsgDispatcher-0 : msg-0 Hello, World
handler1::MsgDispatcher-0 : msg-0 Hello, World
handler2::MsgDispatcher-1 : msg-1 Hello, World
handler1::MsgDispatcher-1 : msg-1 Hello, World
handler2::MsgDispatcher-0 : msg-2 Hello, World
handler1::MsgDispatcher-0 : msg-2 Hello, World
handler3::MsgDispatcher-1 : 2016-12-26
handler3::MsgDispatcher-0 : 2016-12-27
handler3::MsgDispatcher-1 : 2016-12-28

>>> App end

String型のメッセージに対してhandle1, handle2が値を受け取っており、LocalDateのメッセージに対してはhandle3が値を受け取っています。
EventBusに対して発行されたメッセージの型に応じて、対応するハンドラが値を受信していることが分かります。



関連エントリ