From 43f4ef8e3c8dea7780eccab965e43282ed5a4e3d Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Tue, 3 Jul 2018 22:55:47 +0400 Subject: [PATCH] A simple Real Time streaming example with Spring Webflux. 1. Added an API to generate a real time stream returning numbers. 2. Added Test case to consume that API with a webTestClient. 3. Added a client to consume that API, over the network. --- .../pom.xml | 70 +++++++++++++++++ .../java/com/springwebflux/sample/Client.java | 29 +++++++ .../src/main/resources/application.properties | 1 + springflux-5-reactive-ranjeetkaur/pom.xml | 76 +++++++++++++++++++ .../springwebflux/controller/Controller.java | 28 +++++++ .../com/springwebflux/sample/Application.java | 17 +++++ .../src/main/resources/application.properties | 1 + .../sample/ApplicationTests.java | 36 +++++++++ 8 files changed, 258 insertions(+) create mode 100644 springflux-5-reactive-client-ranjeetkaur/pom.xml create mode 100644 springflux-5-reactive-client-ranjeetkaur/src/main/java/com/springwebflux/sample/Client.java create mode 100644 springflux-5-reactive-client-ranjeetkaur/src/main/resources/application.properties create mode 100644 springflux-5-reactive-ranjeetkaur/pom.xml create mode 100644 springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/controller/Controller.java create mode 100644 springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/sample/Application.java create mode 100644 springflux-5-reactive-ranjeetkaur/src/main/resources/application.properties create mode 100644 springflux-5-reactive-ranjeetkaur/src/test/java/com/springwebflux/sample/ApplicationTests.java diff --git a/springflux-5-reactive-client-ranjeetkaur/pom.xml b/springflux-5-reactive-client-ranjeetkaur/pom.xml new file mode 100644 index 0000000000..bb832ae055 --- /dev/null +++ b/springflux-5-reactive-client-ranjeetkaur/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.springboot + sample + 0.0.1-SNAPSHOT + jar + + client + SpringFlux Sample Client + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-webflux + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + --spring.profiles.active=dev + + + + + + + + + spring-releases + https://repo.spring.io/libs-release + + + + + spring-releases + https://repo.spring.io/libs-release + + + + diff --git a/springflux-5-reactive-client-ranjeetkaur/src/main/java/com/springwebflux/sample/Client.java b/springflux-5-reactive-client-ranjeetkaur/src/main/java/com/springwebflux/sample/Client.java new file mode 100644 index 0000000000..5846969803 --- /dev/null +++ b/springflux-5-reactive-client-ranjeetkaur/src/main/java/com/springwebflux/sample/Client.java @@ -0,0 +1,29 @@ +package com.springwebflux.sample; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.web.reactive.function.client.WebClient; + +/** + * @author ranjeetkaur + * + */ +@SpringBootApplication(scanBasePackages = "com.springwebflux.*") +@EnableAsync +public class Client { + + public static void main(String[] args) throws InterruptedException { + + WebClient webClient = WebClient.builder() + .baseUrl("http://localhost:8090") + .build(); + + webClient.get() + .uri("/v1/dice") + .retrieve() + .bodyToFlux(Integer.class) + .log(); + + Thread.sleep(10000); + } +} \ No newline at end of file diff --git a/springflux-5-reactive-client-ranjeetkaur/src/main/resources/application.properties b/springflux-5-reactive-client-ranjeetkaur/src/main/resources/application.properties new file mode 100644 index 0000000000..f667a68bc2 --- /dev/null +++ b/springflux-5-reactive-client-ranjeetkaur/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port =8091 \ No newline at end of file diff --git a/springflux-5-reactive-ranjeetkaur/pom.xml b/springflux-5-reactive-ranjeetkaur/pom.xml new file mode 100644 index 0000000000..3fe4156360 --- /dev/null +++ b/springflux-5-reactive-ranjeetkaur/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + com.springboot + sample + 0.0.1-SNAPSHOT + jar + + webflux-server + SpringFlux Sample Server + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + --spring.profiles.active=dev + + + + + + + + + spring-releases + https://repo.spring.io/libs-release + + + + + spring-releases + https://repo.spring.io/libs-release + + + + diff --git a/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/controller/Controller.java b/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/controller/Controller.java new file mode 100644 index 0000000000..fa3070640e --- /dev/null +++ b/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/controller/Controller.java @@ -0,0 +1,28 @@ +package com.springwebflux.controller; + +import java.time.Duration; +import java.util.Random; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import reactor.core.publisher.Flux; + +/** + * @author ranjeetkaur + * + */ +@RestController +@RequestMapping(value = "/v1") +public class Controller { + + private static Random random = new Random(); + + @GetMapping("/dice") + public Flux rollDice() { + return Flux.interval(Duration.ofSeconds(1)) + .map(pulse -> random.nextInt(5) + 1); + } + +} diff --git a/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/sample/Application.java b/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/sample/Application.java new file mode 100644 index 0000000000..1641885f41 --- /dev/null +++ b/springflux-5-reactive-ranjeetkaur/src/main/java/com/springwebflux/sample/Application.java @@ -0,0 +1,17 @@ +package com.springwebflux.sample; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author ranjeetkaur + * + */ +@SpringBootApplication(scanBasePackages = "com.springwebflux.*") +public class Application { + + public static void main(String[] args) { + + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/springflux-5-reactive-ranjeetkaur/src/main/resources/application.properties b/springflux-5-reactive-ranjeetkaur/src/main/resources/application.properties new file mode 100644 index 0000000000..91f7491179 --- /dev/null +++ b/springflux-5-reactive-ranjeetkaur/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port = 8090 \ No newline at end of file diff --git a/springflux-5-reactive-ranjeetkaur/src/test/java/com/springwebflux/sample/ApplicationTests.java b/springflux-5-reactive-ranjeetkaur/src/test/java/com/springwebflux/sample/ApplicationTests.java new file mode 100644 index 0000000000..ce09d9ae37 --- /dev/null +++ b/springflux-5-reactive-ranjeetkaur/src/test/java/com/springwebflux/sample/ApplicationTests.java @@ -0,0 +1,36 @@ +package com.springwebflux.sample; + +import java.time.Duration; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ApplicationTests { + + @Autowired + private WebTestClient webTestClient; + + @Before + private void setUp() { + webTestClient = webTestClient.mutate() + .responseTimeout(Duration.ofMillis(10000)) + .build(); + } + + @Test + public void rollDice() throws InterruptedException { + webTestClient.get() + .uri("/v1/dice") + .exchange() + .expectStatus() + .isOk() + .expectBodyList(Integer.class); + } +} \ No newline at end of file