Vert.xの紹介

1概要

この記事では、http://vertx.io/[Vert.x]について説明し、その中心となる概念を説明し、それを使用して単純なRESTful Webサービスを作成します。

まずツールキットに関する基本概念を説明し、次にHTTPサーバーにゆっくりと移行してからRESTfullサービスを構築します。

** 2 Vert.xについて

  • Vert.xは、Eclipseの開発者によるオープンソースの反応的で多言語的なソフトウェア開発ツールキットです。

リアクティブプログラミングは非同期ストリームに関連するプログラミングパラダイムであり、非同期ストリームはあらゆる変更またはイベントに応答します。

同様に、Vert.xはイベントバスを使用してアプリケーションのさまざまな部分と通信し、イベントが使用可能になったときにイベントを非同期にハンドラに渡します。

  • Java、Groovy、Ruby、Python、およびJavaScriptなどの複数のJVMおよび非JVM言語をサポートしているため、ポリグロットと呼びます。

3セットアップ

Vert.xを使うためには、Maven依存関係を追加する必要があります。

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-core</artifactId>
    <version>3.4.1</version>
</dependency>

依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22io.vertx%22%20a%3A%22vertx-core%22[here]にあります。 。

3バーティクル

VerticleはVert.xエンジンが実行するコードの一部です。このツールキットは、拡張可能で、必要に応じて実装できる、多数の抽象頂点クラスを提供します。

多言語であるため、バーティクルはサポートされている言語のどれでも書くことができます。アプリケーションは通常、同じVert.xインスタンスで実行されている複数のバーティクルで構成され、イベントバスを介してイベントを使用して互いに通信します。

JAVAでバーティクルを作成するには、クラスは io.vertx.core.Verticle インターフェース、またはそのサブクラスのいずれかを実装する必要があります。

4イベントバス

それはあらゆるVert.xアプリケーションの神経系です。

反応的であるため、バーティクルはメッセージまたはイベントを受け取るまで休止状態のままです。バーティクルはイベントバスを介して互いに通信します。メッセージは文字列から複雑なオブジェクトまで何でも構いません。

メッセージ処理は理想的には非同期で、メッセージはイベントバスのキューに入れられ、制御は送信者に返されます。後でそれはリスニングバーティクルにデキューされます。応答は Future および callback メソッドを使用して送信されます。

5単純なVert.xアプリケーション

  • バーティクルを使って簡単なアプリケーションを作成し、 vertx インスタンスを使ってデプロイしましょう** 。バーティクルを作成するには、

バーティクルを作成するには、 io.vertx.core.AbstractVerticle クラスを拡張し、 start() メソッドをオーバーライドします。

public class HelloVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> future) {
        LOGGER.info("Welcome to Vertx");
    }
}

start() メソッドは、バーティクルがデプロイされたときに vertx インスタンスによって呼び出されます。このメソッドは io.vertx.core.Future をパラメータとして受け取ります。

それでは、Verticleをデプロイしましょう。

public static void main(String[]args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new HelloVerticle());
}

同様に、 AbstractVerticle クラスの__stop()メソッドをオーバーライドすることができます。これは、バーティクルをシャットダウンしている間に呼び出されます。

@Override
public void stop() {
    LOGGER.info("Shutting down application");
}

6. HTTPサーバー

それでは、バーティクルを使ってHTTPサーバーを起動しましょう。

@Override
public void start(Future<Void> future) {
    vertx.createHttpServer()
      .requestHandler(r -> r.response().end("Welcome to Vert.x Intro");
      })
      .listen(config().getInteger("http.port", 9090),
        result -> {
          if (result.succeeded()) {
              future.complete();
          } else {
              future.fail(result.cause());
          }
      });
}

HTTPサーバーを作成するために start() メソッドをオーバーライドし、それにリクエストハンドラを追加しました。 requestHandler() メソッドは、サーバーがリクエストを受け取るたびに呼び出されます。

最後に、サーバーはポートにバインドされ、接続またはサーバーの起動が future.complete() または future.failを使用して成功したかどうかにかかわらず、 AsyncResult <HttpServer> ハンドラが listen()メソッドに渡されますエラーがある場合は__)。

config.getInteger() メソッドは、外部の conf.json ファイルからロードされているHTTPポート設定の値を読み込んでいます。

サーバーをテストしましょう。

@Test
public void whenReceivedResponse__thenSuccess(TestContext testContext) {
    Async async = testContext.async();

    vertx.createHttpClient()
      .getNow(port, "localhost", "/", response -> {
        response.handler(responseBody -> {
          testContext.assertTrue(responseBody.toString().contains("Hello"));
          async.complete();
        });
      });
}

テストには、JUnitと一緒にvertx-unitを使用しましょう。

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-unit</artifactId>
    <version>3.4.1</version>
    <scope>test</scope>
</dependency>

here 最新バージョンを入手することができます。

垂直テストはユニットテストの setup()メソッドの vertx __インスタンスに配置されます。

@Before
public void setup(TestContext testContext) {
    vertx = Vertx.vertx();

    vertx.deployVerticle(SimpleServerVerticle.class.getName(),
      testContext.asyncAssertSuccess());
}

同様に、 vertx インスタンスは__ @ AfterClassのtearDown()メソッドで閉じられます。

@After
public void tearDown(TestContext testContext) {
    vertx.close(testContext.asyncAssertSuccess());
}

@ BeforeClassのsetup()メソッドは TestContext__引数を取ります。これはテストの非同期動作を制御しテストするのに役立ちます。たとえば、バーティクルの展開は非同期なので、正しく展開されない限り、基本的にテストできません。

deployVerticle() メソッドの2つ目のパラメータ、 testContext.asyncAssertSuccess()があります。サーバーVerticle内の future.complete()またはfuture.fail()が呼び出されるのを待ちます。失敗した場合はテストに失敗します。

7. RESTful Webサービス

HTTPサーバーを作成しました。これを使用してRESTfull Webサービスをホストできます。そのためには、 vertx-web という名前のVert.xモジュールがもう1つ必要です。これは vertx-core の上にWeb開発のための多くの追加機能を与えます。

__pom.xmlに依存関係を追加しましょう。

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
    <version>3.4.1</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22io.vertx%22%20a%3A%22vertx-web%22[here]です。

7.1. Router Routes

WebService用の router を作成しましょう。このルータはGETメソッドとハンドラメソッド getArtilces() の簡単なルートをたどります。

Router router = Router.router(vertx);
router.get("/api/baeldung/articles/article/:id")
  .handler(this::getArticles);

getArticle() メソッドは、新しい Article オブジェクトを返す単純なメソッドです。

private void getArticles(RoutingContext routingContext) {
    String articleId = routingContext.request()
      .getParam("id");
    Article article = new Article(articleId,
      "This is an intro to vertx", "baeldung", "01-02-2017", 1578);

    routingContext.response()
      .putHeader("content-type", "application/json")
      .setStatusCode(200)
      .end(Json.encodePrettily(article));
}

Router、 は要求を受け取ると、一致する経路を探し、さらに要求を渡します。 routes はそれに関連付けられたハンドラメソッドを持ち、リクエストとの処理をすべて行います。

今回の場合、ハンドラは getArticle() メソッドを呼び出します。引数として routingContext オブジェクトを受け取ります。パスパラメータ id、 を派生させ、それを使って Article オブジェクトを作成します。

メソッドの最後の部分で、 routingContext オブジェクトの response() メソッドを呼び出してヘッダーを配置し、HTTP応答コードを設定して、JSONエンコードの article オブジェクトを使用して応答を終了します。

7.2. サーバーに Router を追加する

では、前のセクションで作成した router、 をHTTPサーバーに追加しましょう。

vertx.createHttpServer()
  .requestHandler(router::accept)
  .listen(config().getInteger("http.port", 8080),
    result -> {
      if (result.succeeded()) {
          future.complete();
      } else {
          future.fail(result.cause());
      }
});
__requestHandler(router

accept) をサーバーに追加したことに注目してください。これは、リクエストが受信されたときに router オブジェクトの accept()__を呼び出すようにサーバーに指示します。

それでは、WebServiceをテストしましょう。

@Test
public void givenId__whenReceivedArticle__thenSuccess(TestContext testContext) {
    Async async = testContext.async();

    vertx.createHttpClient()
      .getNow(8080, "localhost", "/api/baeldung/articles/article/12345",
        response -> {
            response.handler(responseBody -> {
            testContext.assertTrue(
              responseBody.toString().contains("\"id\" : \"12345\""));
            async.complete();
        });
      });
}

8パッケージVert.xアプリケーション

アプリケーションをデプロイ可能なJavaアーカイブ(.jar)としてパッケージ化するには、Maven Shadeプラグインと execution タグの設定を使用します。

<configuration>
    <transformers>
        <transformer
          implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
                <Main-Class>io.vertx.core.Starter</Main-Class>
                <Main-Verticle>com.baeldung.SimpleServerVerticle</Main-Verticle>
            </manifestEntries>
        </transformer>
    </transformers>
    <artifactSet/>
    <outputFile>
        ${project.build.directory}/${project.artifactId}-${project.version}-app.jar
    </outputFile>
</configuration>

manifestEntriesでは、 Main-Verticle はアプリケーションの開始点を示し、 Main-Class はVert.xクラスで、 vertx インスタンスを作成して__Main-Verticleをデプロイします。

9結論

この紹介記事では、Vert.xツールキットとその基本概念について説明しました。 Vert.xとRESTFull WebServiceを使ってHTTPサーバを作成する方法を見て、 vertx-unit を使ってそれらをテストする方法を示しました。

最後に、アプリケーションを実行可能jarとしてパッケージ化しました。

コードスニペットの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/vertx[over GitHub]で利用可能です。