MBassador
で同じ型の引数を受け取るHandlerを複数定義した場合、発行したメッセージはすべてのハンドラに到着します。
その際に、メッセージがHandlerに到着する順序は不定です。
が、Handlerにおいてpriority
を指定することで、メッセージの到着順序を制御することが可能です。
priority
に高い数値を与えたHandlerに優先的にメッセージが届くようになります。
以下サンプルです
■ハンドラの定義
Handlerとなるメソッドを3つ定義しています、各メソッドに付与した@Handler
アノテーションに対して、priority
パラメータで各々1, 5, 7の値を指定しています。
import net.engio.mbassy.listener.Handler; class MsgHandler { @Handler(priority = 1) public void handlePriority1(String msg) { System.out.println("priority1 Handle::" + msg); } @Handler(priority = 5) public void handlePriority5(String msg) { System.out.println("priority5 Handle::" + msg); } @Handler(priority = 7) public void handlePriority7(String msg) { System.out.println("priority7 Handle::" + msg); } }
■EventBus生成・Handlerのsubscribe・メッセージ発行
import net.engio.mbassy.bus.MBassador; public class SampleLauncher { public static void main(String[] args) { System.out.println(">>> App start"); MBassador eventBus = new MBassador(); MsgHandler handler = new MsgHandler(); eventBus.subscribe(handler); // ハンドラの登録 // メッセージ発行 eventBus.publishAsync("data-0000001"); eventBus.publishAsync("data-0000002"); eventBus.publishAsync("data-0000003"); eventBus.publishAsync("data-0000004"); eventBus.publishAsync("data-0000005"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\n>>> App end"); } }
■実行結果
>>> App start priority7 Handle::data-0000001 priority5 Handle::data-0000001 priority1 Handle::data-0000001 priority7 Handle::data-0000002 priority5 Handle::data-0000002 priority1 Handle::data-0000002 priority7 Handle::data-0000003 priority5 Handle::data-0000003 priority1 Handle::data-0000003 priority7 Handle::data-0000004 priority5 Handle::data-0000004 priority1 Handle::data-0000004 priority7 Handle::data-0000005 priority5 Handle::data-0000005 priority1 Handle::data-0000005 >>> App end
priorityに高い数値を指定したHandlerから順にメッセージを受信していることが分かります。