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); + } +}