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.
This commit is contained in:
		
							parent
							
								
									b7355cbab0
								
							
						
					
					
						commit
						43f4ef8e3c
					
				
							
								
								
									
										70
									
								
								springflux-5-reactive-client-ranjeetkaur/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								springflux-5-reactive-client-ranjeetkaur/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
| 	<groupId>com.springboot</groupId> | ||||
| 	<artifactId>sample</artifactId> | ||||
| 	<version>0.0.1-SNAPSHOT</version> | ||||
| 	<packaging>jar</packaging> | ||||
| 
 | ||||
| 	<name>client</name> | ||||
| 	<description>SpringFlux Sample Client</description> | ||||
| 
 | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>2.0.3.RELEASE</version> | ||||
| 		<relativePath /> | ||||
| 	</parent> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
| 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||
| 		<java.version>1.8</java.version> | ||||
| 	</properties> | ||||
| 
 | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-webflux</artifactId> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<build> | ||||
| 		<plugins> | ||||
| 			<plugin> | ||||
| 				<groupId>org.springframework.boot</groupId> | ||||
| 				<artifactId>spring-boot-maven-plugin</artifactId> | ||||
| 				<executions> | ||||
| 					<execution> | ||||
| 						<goals> | ||||
| 							<goal>repackage</goal> | ||||
| 						</goals> | ||||
| 					</execution> | ||||
| 				</executions> | ||||
| 				<configuration> | ||||
| 					<arguments> | ||||
| 						<argument>--spring.profiles.active=dev</argument> | ||||
| 					</arguments> | ||||
| 				</configuration> | ||||
| 			</plugin> | ||||
| 		</plugins> | ||||
| 	</build> | ||||
| 
 | ||||
| 	<repositories> | ||||
| 		<repository> | ||||
| 			<id>spring-releases</id> | ||||
| 			<url>https://repo.spring.io/libs-release</url> | ||||
| 		</repository> | ||||
| 	</repositories> | ||||
| 	<pluginRepositories> | ||||
| 		<pluginRepository> | ||||
| 			<id>spring-releases</id> | ||||
| 			<url>https://repo.spring.io/libs-release</url> | ||||
| 		</pluginRepository> | ||||
| 	</pluginRepositories> | ||||
| 
 | ||||
| </project> | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1 @@ | ||||
| server.port =8091 | ||||
							
								
								
									
										76
									
								
								springflux-5-reactive-ranjeetkaur/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								springflux-5-reactive-ranjeetkaur/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
| 	<groupId>com.springboot</groupId> | ||||
| 	<artifactId>sample</artifactId> | ||||
| 	<version>0.0.1-SNAPSHOT</version> | ||||
| 	<packaging>jar</packaging> | ||||
| 
 | ||||
| 	<name>webflux-server</name> | ||||
| 	<description>SpringFlux Sample Server</description> | ||||
| 
 | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>2.0.3.RELEASE</version> | ||||
| 		<relativePath /> | ||||
| 	</parent> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
| 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||
| 		<java.version>1.8</java.version> | ||||
| 	</properties> | ||||
| 
 | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-webflux</artifactId> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-test</artifactId> | ||||
| 			<scope>test</scope> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<build> | ||||
| 		<plugins> | ||||
| 			<plugin> | ||||
| 				<groupId>org.springframework.boot</groupId> | ||||
| 				<artifactId>spring-boot-maven-plugin</artifactId> | ||||
| 				<executions> | ||||
| 					<execution> | ||||
| 						<goals> | ||||
| 							<goal>repackage</goal> | ||||
| 						</goals> | ||||
| 					</execution> | ||||
| 				</executions> | ||||
| 				<configuration> | ||||
| 					<arguments> | ||||
| 						<argument>--spring.profiles.active=dev</argument> | ||||
| 					</arguments> | ||||
| 				</configuration> | ||||
| 			</plugin> | ||||
| 		</plugins> | ||||
| 	</build> | ||||
| 
 | ||||
| 	<repositories> | ||||
| 		<repository> | ||||
| 			<id>spring-releases</id> | ||||
| 			<url>https://repo.spring.io/libs-release</url> | ||||
| 		</repository> | ||||
| 	</repositories> | ||||
| 	<pluginRepositories> | ||||
| 		<pluginRepository> | ||||
| 			<id>spring-releases</id> | ||||
| 			<url>https://repo.spring.io/libs-release</url> | ||||
| 		</pluginRepository> | ||||
| 	</pluginRepositories> | ||||
| 
 | ||||
| </project> | ||||
| @ -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<Integer> rollDice() { | ||||
|         return Flux.interval(Duration.ofSeconds(1)) | ||||
|             .map(pulse -> random.nextInt(5) + 1); | ||||
|     } | ||||
|      | ||||
| } | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1 @@ | ||||
| server.port = 8090 | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user