はじめに
初投稿ということで拙い記載となっている点はご容赦ください。
『Spring WebFlux』というワードを最近知ったので、チュートリアルを通して触れてみようと思います。
WebFluxとは
Spring WebFluxはSpringが提供するWebフレームワークであり、ノンブロッキングな処理を行うことができます。
ざっくりですが、『スレッドを節約しつつ、効率よく処理ができる仕組み』だと理解しました。
今回やること
以下のページにあるチュートリアルをやってみたいと思います。
Building a Reactive RESTful Web Service
開発環境
・Visual Studio Code
・AdoptOpenJDK 11.0.5+10
1. 準備
ソースコードを自分のローカルにcloneします。
$ git clone https://github.com/spring-guides/gs-reactive-rest-service.git
Cloning into 'gs-reactive-rest-service'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 822 (delta 6), reused 14 (delta 5), pack-reused 801
Receiving objects: 100% (822/822), 408.59 KiB | 771.00 KiB/s, done.
Resolving deltas: 100% (553/553), done.
vscodeで開発するので、開発したフォルダを開きます。
メニュー:ファイル>開く>cloneしたgs-reactive-rest-serviceフォルダ
2. WebFlux Handlerをつくる。
initial/src/main/java/hello
配下にGreetingHandler.javaを新規作成します。
package hello;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
@Component
public class GreetingHandler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello, Spring!"));
}
}
3. Routerをつくる。
initial/src/main/java/hello
配下にGreetingRouter.javaを新規作成します。
package hello;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
@Configuration
public class GreetingRouter {
@Bean
public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/hello").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), greetingHandler::hello);
}
}
4. WebClientをつくる。
initial/src/main/java/hello
配下にGreetingWebClient.javaを新規作成します。
package hello;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
public class GreetingWebClient {
private WebClient client = WebClient.create("http://localhost:8080");
private Mono<ClientResponse> result = client.get()
.uri("/hello")
.accept(MediaType.TEXT_PLAIN)
.exchange();
public String getResult() {
return ">> result = " + result.flatMap(res -> res.bodyToMono(String.class)).block();
}
}
5. アプリを実行できるようにする。
initial/src/main/java/hello
配下にApplication.javaを新規作成します。
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
GreetingWebClient gwc = new GreetingWebClient();
System.out.println(gwc.getResult());
}
}
6. 実行してみる。
Application.javaを右クリックして、Runを選択してみると以下のメッセージがターミナルに表示されます。
>> result = Hello, Spring WebFlux!
同様に、http://localhost:8080/hello をブラウザで開いてみても同じメッセージが表示されます。
最後に
最後まで読んでいただきありがとうございます。
自分と同じようなプログラミングに興味はあるけど、とっかかりがない人の一助になればいいなと思います。