読者です 読者をやめる 読者になる 読者になる

冒険の書 - Lv1プログラマの歩み

プログラミング経験ほぼゼロでプログラマーとして採用されてしまった若者のLv上げの歩みを記録するブログ

vertx で EventBusによる通信をやってみた

event loop threadで動くWebsocketVerticleはできている。

それをどうMysqlVerticleに繋ぐかというところ。

 

マニュアルからイベントバスの構造理解をしないと話は進まない。

JavaでVert.x(イベントバスについて)

 

初心者なので、わからない単語を調べるところから。英語の勉強みたい。

・ピア・トゥー・ピア(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でのデプロイにしてないかも・・・?