1概要
このクイック記事では、SpringとVert-xの統合について説明し、強力で有名なSpringの機能、およびVert.xからのリアクティブシングルイベントループの両方の長所を活用します。
Vert.xについてもっと理解するために、私たちの紹介記事リンクを参照してください:/vertx[ここ]。
2セットアップ
まず、依存関係を整えましょう。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.4.1</version>
</dependency>
バーティクルを使用してサービスをデプロイするため、____spring-boot-starter-webから埋め込みTomcat依存関係を除外しています。
最新の依存関係https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.vertx%22%20AND%20a%3A%22vertx-web%22[here]を見つけることができます。
3 Spring Vert.xアプリケーション
これで、2つのバーティクルがデプロイされたサンプルアプリケーションを作成します。
最初のVerticleはリクエストをハンドラーにルーティングし、ハンドラーはそれをメッセージとして与えられたアドレスに送ります。もう一方のVerticleは与えられたアドレスをリッスンします。
これらを実際に見てみましょう。
3.1. 送信者バーティクル
-
ServerVerticle はHTTPリクエストを受け取り、それらをメッセージとして指定されたアドレスに送信します。
@Override
public void start() throws Exception {
super.start();
Router router = Router.router(vertx);
router.get("/api/baeldung/articles")
.handler(this::getAllArticlesHandler);
vertx.createHttpServer()
.requestHandler(router::accept)
.listen(config().getInteger("http.port", 8080));
}
サーバーリクエストハンドラでは、受信リクエストを getAllArticlesHandler ハンドラにリダイレクトする router オブジェクトを渡しました。
private void getAllArticlesHandler(RoutingContext routingContext) {
vertx.eventBus().<String>send(ArticleRecipientVerticle.GET__ALL__ARTICLES, "",
result -> {
if (result.succeeded()) {
routingContext.response()
.putHeader("content-type", "application/json")
.setStatusCode(200)
.end(result.result()
.body());
} else {
routingContext.response()
.setStatusCode(500)
.end();
}
});
}
ハンドラーメソッドでは、 GET ALL__ARTICLESというイベントIDを使用して、Vert.xイベントバスにイベントを渡します。その後、成功およびエラーのシナリオに応じてコールバックを処理します。
イベントバスからのメッセージは__ArticleRecipientVerticleによって消費されます。これについては次のセクションで説明します。
3.2. 受信者のバーチクル
-
ArticleRecipientVerticle は受信メッセージをリッスンし、Spring bean ** を注入します。これはSpringとVert.xのランデブーポイントとして機能します。
SpringサービスBeanをVerticalにインジェクトし、それぞれのメソッドを呼び出します。
@Override
public void start() throws Exception {
super.start();
vertx.eventBus().<String>consumer(GET__ALL__ARTICLES)
.handler(getAllArticleService(articleService));
}
ここで、 articleService は挿入されたSpring Beanです。
@Autowired
private ArticleService articleService;
このVerticleはアドレス GET ALL ARTICLESでイベントバスをリッスンし続けます。メッセージを受信すると、 getAllArticleService__ハンドラメソッドに委任します。
private Handler<Message<String>> getAllArticleService(ArticleService service) {
return msg -> vertx.<String> executeBlocking(future -> {
try {
future.complete(
mapper.writeValueAsString(service.getAllArticle()));
} catch (JsonProcessingException e) {
future.fail(e);
}
}, result -> {
if (result.succeeded()) {
msg.reply(result.result());
} else {
msg.reply(result.cause().toString());
}
});
}
これにより、必要なサービス操作が実行され、ステータスとともにメッセージに返信されます。メッセージ返信は、前のセクションで見たように ServerVerticle とコールバック result で参照されています。
4サービスクラス
サービスクラスは単純な実装であり、リポジトリ層とやり取りするためのメソッドを提供します。
@Service
public class ArticleService {
@Autowired
private ArticleRepository articleRepository;
public List<Article> getAllArticle() {
return articleRepository.findAll();
}
}
ArticleRepository は org.springframework.data.repository.CrudRepository を拡張し、基本的なCRUD機能を提供します。
5 Verticleを展開する
通常のSpring Bootアプリケーションの場合と同じ方法で、アプリケーションをデプロイします。 Springコンテキストの初期化が完了したら、Vert.Xインスタンスを作成し、そこにVerticleをデプロイする必要があります。
public class VertxSpringApplication {
@Autowired
private ServerVerticle serverVerticle;
@Autowired
private ArticleRecipientVerticle articleRecipientVerticle;
public static void main(String[]args) {
SpringApplication.run(VertxSpringApplication.class, args);
}
@PostConstruct
public void deployVerticle() {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(serverVerticle);
vertx.deployVerticle(articleRecipientVerticle);
}
}
SpringアプリケーションクラスにVerticleインスタンスを注入していることに注意してください。だから、私たちはVerticleクラスに注釈をつける必要があります。
そのため、Verticleクラスの ServerVerticle と ArticleRecipientVerticle に @Component とアノテーションを付ける必要があります。
アプリケーションをテストしましょう。
@Test
public void givenUrl__whenReceivedArticles__thenSuccess() {
ResponseEntity<String> responseEntity = restTemplate
.getForEntity("http://localhost:8080/api/baeldung/articles", String.class);
assertEquals(200, responseEntity.getStatusCodeValue());
}