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>
使い方の概要
メッセージを購読するためのHandler(Listner)を定義する。
EventBusを生成して、定義したHandlerをsubscribeする
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#publishAsync
(MBassador#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として利用することができることが分かりました。
本エントリではかなり単純なメッセ―ジを送る事しかしませんでしが、もっと色々できますので後々紹介できればと思います。