Vert.xスプリング統合

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());
}

6. 結論

この記事では、SpringとVert.xを使ってRESTful Webサービスを構築する方法について学びました。

いつものように、例は利用可能です over on GitHub。