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 @Slf 4j@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 @Slf 4j@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); } }
実行 以下のコマンドで実行。
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に接続ができそうである。この確認はまた今度。
おわり。