覚えたら書く

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

MBassador - Handlerの優先順位を制御する

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から順にメッセージを受信していることが分かります。



関連エントリ