MBassador
を用いてメッセージのハンドリングを行う場合のメッセージのサブクラスに対する動きを確認します。
本エントリでは、MessageObj
とその子クラスの SubMessageObj
を定義しました。これらをEventBusにpublishします。
■メッセージクラスの定義
public class MessageObj { protected final String rawMsg; public MessageObj(String rawMsg) { this.rawMsg = rawMsg; } String message() { return "MessageObj -> " + rawMsg; } }
public class SubMessageObj extends MessageObj { public SubMessageObj(String rawMsg) { super(rawMsg); } @Override public String message() { return "MessageImpl -> " + rawMsg; } }
デフォルトでのサブクラスのメッセージ受信時の動き
■Handlerの定義
MessageObj
を引数に取るhandle1とSubMessageObj
を引数に取るhandle2を定義しました
import net.engio.mbassy.listener.Handler; class MessageObjListener { @Handler public void handle1(MessageObj msg){ System.out.println("handle [MessageObj]: " + msg.message()); } @Handler public void handle2(SubMessageObj msg){ System.out.println("handle [SubMessageObj]: " + msg.message()); } }
■EventBusを作成してメッセージ送信
EventBusに上で定義したハンドラをセットしてMessageObj
とSubMessageObj
のインスタンスを送信し動きを確認します
import net.engio.mbassy.bus.MBassador; public class Main { public static void main(String[] args) { MBassador<Object> bus = new MBassador<>(); bus.subscribe(new MessageObjListener()); bus.publishAsync(new MessageObj("Hello World! - 1")); bus.publishAsync(new MessageObj("Hello World! - 2")); bus.publishAsync(new SubMessageObj("Hello World! - 1000")); bus.publishAsync(new SubMessageObj("Hello World! - 2000")); try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\n>>> App end"); } }
■実行結果
handle [MessageObj]: MessageObj -> Hello World! - 1 handle [MessageObj]: MessageObj -> Hello World! - 2 handle [SubMessageObj]: SubMessageObj -> Hello World! - 1000 handle [MessageObj]: SubMessageObj -> Hello World! - 1000 handle [SubMessageObj]: SubMessageObj -> Hello World! - 2000 handle [MessageObj]: SubMessageObj -> Hello World! - 2000 >>> App end
MessageObjListener#handle1
の引数はMessageObj
ですが、MessageObj
およびその子クラスのSubMessageObj
も受け取っていることが分かります。
サブクラスのメッセージ受信しないようにする
場合によってはサブクラスのメッセージを受信したくない場合もあります。その場合は@Handler
アノテーションのrejectSubtypes
パラメータを利用します
■Handlerの定義
ハンドラとして扱うメソッドに@Handler
を付与するとともにrejectSubtypes
パラメータにtrueを指定します。これで引数のサブクラスのメッセージが受信しなくなります。
import net.engio.mbassy.listener.Handler; class MessageObjListener { @Handler(rejectSubtypes = true) public void handle1(MessageObj msg){ System.out.println("handle [MessageObj]: " + msg.message()); } @Handler public void handle2(SubMessageObj msg){ System.out.println("handle [SubMessageObj]: " + msg.message()); } }
■EventBusを作成してメッセージ送信
EventBusに上で定義したハンドラをセットしてMessageObj
とSubMessageObj
のインスタンスを送信し動きを確認します
import net.engio.mbassy.bus.MBassador; public class Main { public static void main(String[] args) { MBassador<Object> bus = new MBassador<>(); bus.subscribe(new MessageObjListener()); bus.publishAsync(new MessageObj("Hello World! - 1")); bus.publishAsync(new MessageObj("Hello World! - 2")); bus.publishAsync(new SubMessageObj("Hello World! - 1000")); bus.publishAsync(new SubMessageObj("Hello World! - 2000")); try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\n>>> App end"); } }
■実行結果
handle [MessageObj]: MessageObj -> Hello World! - 1 handle [MessageObj]: MessageObj -> Hello World! - 2 handle [SubMessageObj]: SubMessageObj -> Hello World! - 1000 handle [SubMessageObj]: SubMessageObj -> Hello World! - 2000 >>> App end
MessageObjListener#handle1
はMessageObj
のメッセージだけ受け取り、その子クラスのSubMessageObj
のメッセージを受信しなくなっていることが分かります。