package io.spring.demo.streaming.portfolio; import reactor.core.publisher.Flux; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.reactive.function.client.WebClient; import static org.springframework.http.MediaType.APPLICATION_STREAM_JSON; @Controller public class HomeController { private final UserRepository userRepository; public HomeController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping("/") public String home(Model model) { model.addAttribute("users", this.userRepository.findAll()); return "index"; } @GetMapping(path = "/quotes/feed", produces = MediaType.TEXT_EVENT_STREAM_VALUE) @ResponseBody public Flux<Quote> fetchQuotesStream() { return WebClient.create("http://localhost:8081") .get() .uri("/quotes") .accept(APPLICATION_STREAM_JSON) .retrieve() .bodyToFlux(Quote.class) .share() .log(); } @GetMapping("/quotes") public String quotes() { return "quotes"; } }