From 6254ad95f7df4d01c6186bc572e6ad4c0cf1df16 Mon Sep 17 00:00:00 2001 From: Abhinayak Swar Date: Wed, 6 Jun 2018 01:16:56 +0545 Subject: [PATCH] abh.swar@gmail.com: Code check-in for article on Spring WebFlux 1. EmailWebClient is the client that subscribes to the data from WebFlux server 2. EmailGenerator generates one email per second randomly 3. EmailHandler and EmailRouter deal with handling of request of the subscriber 4. Email is the POJO for data transmitted by the server --- .../reactive/client/EmailWebClient.java | 33 ++++++++++++++ .../reactive/generator/EmailGenerator.java | 41 +++++++++++++++++ .../reactive/handler/EmailHandler.java | 22 +++++++++ .../com/baeldung/reactive/model/Email.java | 45 +++++++++++++++++++ .../baeldung/reactive/router/EmailRouter.java | 22 +++++++++ 5 files changed, 163 insertions(+) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/client/EmailWebClient.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/generator/EmailGenerator.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/handler/EmailHandler.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Email.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/router/EmailRouter.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/EmailWebClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/EmailWebClient.java new file mode 100644 index 0000000000..9a2f1969ec --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/EmailWebClient.java @@ -0,0 +1,33 @@ +package com.baeldung.reactive.client; + +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.Disposable; + +public class EmailWebClient { + + public Disposable getEmails() { + WebClient webClient = WebClient.builder() + .baseUrl("http://localhost:8080") + .build(); + + return webClient.get() + .uri("/emails") + .accept(MediaType.APPLICATION_STREAM_JSON) + .exchange() + .subscribe(email -> System.out.println("Email: " + email)); + } + + public static void main(String[] args) { + EmailWebClient vehiclesWebClient = new EmailWebClient(); + Disposable disposable = vehiclesWebClient.getEmails(); + try { + // sleep for 5 minutes + Thread.sleep(300000); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + disposable.dispose(); + } + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/generator/EmailGenerator.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/generator/EmailGenerator.java new file mode 100644 index 0000000000..1d01da0bf0 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/generator/EmailGenerator.java @@ -0,0 +1,41 @@ +package com.baeldung.reactive.generator; + +import com.baeldung.reactive.model.Email; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Flux; + +import java.time.Duration; +import java.util.*; + +@Component +public class EmailGenerator { + private static Map emailMap = new HashMap() { + { + put("emailBob", new Email("Hello", "Hello Bob")); + put("emailRob", new Email("Hello1", "Hello Rob")); + put("emailJeff", new Email("Hello2", "Hello Jeff")); + put("emailTom", new Email("Hello3", "Hello Tom")); + put("emailBobby", new Email("Hello4", "Hello Bobby")); + } + }; + + public Flux fetchQuoteStream() { + return Flux.interval(Duration.ofSeconds(1)) + .onBackpressureDrop() + .map(this::generateEmail) + .flatMapIterable(emails -> emails); + } + + /* + * Create an email for all tickers + */ + private List generateEmail(long interval) { + Object[] emailKeys = emailMap.keySet() + .toArray(); + List emailList = new ArrayList<>(); + + // select random email message from emailMap + emailList.add(emailMap.get(emailKeys[new Random().nextInt(emailKeys.length)])); + return emailList; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/EmailHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/EmailHandler.java new file mode 100644 index 0000000000..986f319640 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/EmailHandler.java @@ -0,0 +1,22 @@ +package com.baeldung.reactive.handler; + +import com.baeldung.reactive.generator.EmailGenerator; +import com.baeldung.reactive.model.Email; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class EmailHandler { + + @Autowired EmailGenerator emailGenerator; + + public Mono getEmails(ServerRequest serverRequest) { + return ServerResponse.ok() + .contentType(MediaType.APPLICATION_STREAM_JSON) + .body(emailGenerator.fetchQuoteStream(), Email.class); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Email.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Email.java new file mode 100644 index 0000000000..4e9dd587ab --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Email.java @@ -0,0 +1,45 @@ +package com.baeldung.reactive.model; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +public class Email { + @NotBlank + private String title; + + @NotBlank + private String message; + + @NotNull + private Date createdDate = new Date(); + + public Email(@NotBlank String title, @NotBlank String message) { + this.title = title; + this.message = message; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/router/EmailRouter.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/router/EmailRouter.java new file mode 100644 index 0000000000..cf9d2447cd --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/router/EmailRouter.java @@ -0,0 +1,22 @@ +package com.baeldung.reactive.router; + +import com.baeldung.reactive.handler.EmailHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +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; + +@Component +public class EmailRouter { + + @Bean + public RouterFunction route(EmailHandler handler) { + return RouterFunctions.route(RequestPredicates + .GET("/emails") + .and(RequestPredicates.accept(MediaType.APPLICATION_STREAM_JSON)), + handler::getEmails); + } +}