Vert.Xアプリを作る上でVert.XからRedisに接続したり、JDBCで接続したいことがよくある。データソースに接続する部分で細かいところを触りだすとSpringのモジュールが使いたいなと思ってSpring bootでVert.xを動作させることを試したのでメモしておく。

dependency

お決まりのSPRING INITIALIZRでプロジェクトを作成する。
lombokだけ指定してプロジェクトを作成した。

dependencyにはvertxを追加。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

Verticle追加

前に作ったアプリをベースに2つのVerticleを追加する。

ServerVerticleはHTTPレスポンスを返して、WorkerVerticleにeventBusを使ってメッセージを渡します。Spring-bootアプリケーションなので@ComponentでSpringのDIコンテナにVerticleを登録することができます。

ServerVerticle.java
@Slf4j
@Component
public class ServerVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) {
log.info("vertx started.");
vertx
.createHttpServer()
.requestHandler(r -> {
r.bodyHandler(body -> {
JsonObject obj = new JsonObject()
.put("hogehoge", "sample message");
vertx.eventBus().send("message", obj);
}).response().end("<h1>Hello from my first " +
"Vert.x 3 application</h1>");
})
.listen(8080, result -> {
if (result.succeeded()) {
fut.complete();
} else {
fut.fail(result.cause());
}
});
}
}

WorkerVerticleはServerVerticleから受け取ったメッセージログ出力します。ServerVerticleと同様に@Componentを使ってSpringのDIコンテナに登録します。

WorkerVerticle.java
@Slf4j
@Component
public class WorkerVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.eventBus().consumer("message", message -> {
JsonObject obj = (JsonObject) message.body();
log.info(obj.toString());
});
}
}

アプリケーションの作成

Springアプリケーションとして実行します。Spring bootアプリケーションとして実行するためSpring bootで1スレッドが利用されます。PostConstructなメソッドからServerVerticleとWorkerVerticleを取り出しVert.xのVerticleとして実行します。

SpringBootVertxSampleApplication.java
@SpringBootApplication
public class SpringBootVertxSampleApplication {
@Autowired
private ServerVerticle serverVerticle;

@Autowired
private WorkerVerticle workerVerticle;

@PostConstruct
public void deployVerticle() {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(serverVerticle);
vertx.deployVerticle(workerVerticle, new DeploymentOptions().setWorker(true));
}

public static void main(String[] args) {
SpringApplication.run(SpringBootVertxSampleApplication.class, args);
}
}

実行

以下のコマンドで実行。

./mvnw spring-boot:run

http://localhost:8080にブラウザで接続すると画面にメッセージが表示され、標準出力には以下のログが出力されることが確認できます。

2016-08-31 01:03:20.643  INFO 4434 --- [ntloop-thread-0] com.example.verticle.ServerVerticle      : vertx started.
2016-08-31 01:03:38.275 INFO 4434 --- [worker-thread-1] com.example.verticle.WorkerVerticle : {"hogehoge":"sample message"}
2016-08-31 01:03:41.985 INFO 4434 --- [worker-thread-2] com.example.verticle.WorkerVerticle : {"hogehoge":"sample message"}

まとめ

spring bootが便利なフレームワークなのでVert.x単体で使いよりもSpringと組み合わせて使うほうが便利に使えそうである。Redis接続やJDBCはやっていないが、spring-boot-data-redisとかspring-boot-data-jpaを使ってWorkerVerticleに@Autowiredすることで簡単にRedisやMySQLに接続ができそうである。この確認はまた今度。

おわり。