覚えたら書く

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

MBassador - 異なる型のメッセージを1つのHandlerでハンドリングする

MBassadorを用いてメッセージのハンドリングを行う場合、通常メッセージの型ごとにハンドラを用意することになりますが、
@Envelopedアノテーションを使用することで複数の異なる型のメッセージを1つのハンドラでハンドリグすることが可能となります。

以下実行サンプルです


■Handlerの定義

ハンドラとして扱うメソッドに@Handlerを付与するとともに、@Envelopedアノテーションを付与します。
そしてこの@Envelopedアノテーションのmessagesパラメータに、このハンドラで取り扱うメッセージの型を指定します。
さらにハンドラとするメソッドの引数の型をMessageEnvelopeにします。

import net.engio.mbassy.listener.Enveloped;
import net.engio.mbassy.listener.Handler;
import net.engio.mbassy.subscription.MessageEnvelope;

import java.time.LocalDate;

class SimpleMsgListener {

    @Handler
    @Enveloped(messages = {Integer.class, String.class, LocalDate.class})
    public void handle(MessageEnvelope envelope) {
        System.out.println("type = " + envelope.getMessage().getClass() + ", msg = " + envelope.getMessage());
    }
}


■EventBusを作成してメッセージ送信

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);    // ハンドラの登録

        // StringとintとLocalDateのメッセージ送信
        for (int i = 0; i < 3; i++) {
            eventBus.publishAsync(i);
            eventBus.publishAsync("Hello World" + i);
            eventBus.publishAsync(LocalDate.of(2017, 2, i + 10));
        }

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

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

■実行結果

>>> App start
type = class java.lang.Integer, msg = 0
type = class java.lang.String, msg = Hello World0
type = class java.time.LocalDate, msg = 2017-02-10
type = class java.lang.Integer, msg = 1
type = class java.lang.String, msg = Hello World1
type = class java.time.LocalDate, msg = 2017-02-11
type = class java.lang.String, msg = Hello World2
type = class java.time.LocalDate, msg = 2017-02-12
type = class java.lang.Integer, msg = 2

>>> App end

無事に、一つのハンドラでString型、int型、LocalDate型のメッセージをハンドリングできました。



関連エントリ