1. 概要
この簡単な記事では、SpringとVert-xの統合について説明し、強力でよく知られているSpring機能とVert.xのリアクティブシングルイベントループの両方の長所を活用します。
Vert.xの詳細については、紹介記事こちらを参照してください。
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-websから埋め込みTomcat依存関係を除外していることに注意してください。
最新の依存関係ここを見つけることができます。
3. SpringVert.xアプリケーション
次に、2つのバーティクルがデプロイされたサンプルアプリケーションを作成します。
最初のVerticleは、リクエストをハンドラーにルーティングします。ハンドラーは、リクエストをメッセージとして指定されたアドレスに送信します。 他のVerticleは、指定されたアドレスでリッスンします。
これらの動作を見てみましょう。
3.1. 送信者の頂点
ServerVerticleはHTTPリクエストを受け入れ、それらをメッセージとして指定されたアドレスに送信します。 を作成しましょう ServerVerticle クラスを拡張する AbstractVerticle、 をオーバーライドします始める() 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ハンドラーにリダイレクトされます。
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();
}
});
}
ハンドラーメソッドでは、イベントIDを次のようにVert.xイベントバスに渡します。 GET_ALL_ARTICLES。 次に、成功とエラーのシナリオに応じてコールバックを処理します。
イベントバスからのメッセージは、次のセクションで説明する ArticleRecipientVerticle 、によって消費されます。
3.2. 受信者の頂点
ArticleRecipientVerticleは着信メッセージをリッスンし、SpringBeanを注入します。 SpringとVert.xのランデブーポイントとして機能します。
SpringサービスbeanをVerticleに注入し、それぞれのメソッドを呼び出します。
@Override
public void start() throws Exception {
super.start();
vertx.eventBus().<String>consumer(GET_ALL_ARTICLES)
.handler(getAllArticleService(articleService));
}
ここで、articleServiceは注入されたSpringBeanです。
@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. 頂点の展開
通常のSpringBootアプリケーションの場合と同じように、アプリケーションをデプロイします。 Springコンテキストの初期化が完了した後、Vert.Xインスタンスを作成し、その中にバーティクルをデプロイする必要があります。
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クラス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を使用してRESTfulWebサービスを構築する方法について学びました。
いつものように、この例はGitHubで入手できます。