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型のメッセージをハンドリングできました。