以前のエントリで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に対して発行されたメッセージの型に応じて、対応するハンドラが値を受信していることが分かります。