vertx で EventBusによる通信をやってみた
event loop threadで動くWebsocketVerticleはできている。
それをどうMysqlVerticleに繋ぐかというところ。
マニュアルからイベントバスの構造理解をしないと話は進まない。
初心者なので、わからない単語を調べるところから。英語の勉強みたい。
・ピア・トゥー・ピア(P2P):サーバ同士が互いを対等として呼び合うことができるアーキテクチャ(対義:クラ-サーバ通信)
・ハンドラ:何らかの処理要求が発生したときに起動されるプログラムなど。本筋とは独立しており、普段は待機。
・ラウンドロビンアルゴリズム:優先度を決めない決定方法(完全ランダムな抽出に近いのか?)
・トランジェント:一時的な
<イベントバスAPIの作り方>
1.呼ばれて動くハンドラの作成
2.アドレスにハンドラの登録 及び アドレスからハンドラの登録解除
4.アドレスへメッセージのsend(対1の送信) or publish(対多の送信)
□メッセージとハンドラとアドレスの関係について
メッセージをアドレスに対して送信→アドレスに登録されたハンドラがメッセージを受信して処理を実行
□アドレスについて
・どんな文字列でもよいが、わかりやすさのために「名前空間をピリオドで区切る」などのルールがあると良い。
・一つのアドレスに複数のハンドラを登録することができる(Verticleの種類は問わず)
(一つのハンドラは複数のアドレスに登録することもできる)
□送信・配信時
リプライハンドラの指定により、キャッチボールのような交互の通信が可能になる
□メッセージで送れる型
Boolean, Buffer, byte[], Byte, Character, Double, Float, Integer, JsonObject, JsonArray, Long, Short, String
オススメ:JSONデータ(Vert.xがサポートする言語全てで簡単に作成・パースできる)
ふむ。とりあえずイベントバスで通信してみよう。
MysqlVerticle.java
import io.vertx.core.eventbus.EventBus;
public class MysqlVerticle extends AbstractVerticle {public void start() {
// ハンドラの登録
EventBus eb = vertx.eventBus();
eb.send("test.address", "hello test world");
}
}
TestVerticle.java
import io.vertx.core.Handler;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.Message;
import io.vertx.core.AbstractVerticle;
public class WebSocketVerticle extends AbstractVerticle {public void start() {
// ハンドラの登録
EventBus eb = vertx.eventBus();
Handler<Message<String>> myHandler = new Handler<Message<String>>() {
public void handle(Message<String> message) {
System.out.println("I received a message " + message.body());
}
};
eb.consumer("test.address", myHandler);
// MysqlVerticleデプロイ
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("MysqlVerticle", options, res -> {
if (res.succeeded()) {
System.out.println("Deploy SUCCESS.");
} else {
throw new RuntimeException(res.cause());
}
});
}
(追加した箇所の切り抜きだから、これだけを作っても動かないかもしれないけど)
2箇所困った点
・message.bodyじゃダメで、message.body()に修正が必要だった
・vertx.eventBus().registerHandler("hoge", handler);は
vertx3だとvertx.eventBus().consumer("hoge", handler);に代わったぽい。
エラー: シンボルを見つけられません
eb.registerHandler("test.address", myHandler);
^
これで引っかかり。メソッドが代わってることに気づき・consumerを見つけるまでに時間かかった。。。
とりあえず動いたー。
あれ、、、Worker threadでのデプロイにしてないかも・・・?