From e12d1f0676041266acccc2d273bd95a3247b40db Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Sat, 7 Jul 2018 19:50:07 +0100 Subject: [PATCH 1/3] BAEL-1555 --- .../src/main/java/com/baeldung/Constants.java | 21 +++++ .../web/ResponseBodyEmitterController.java | 36 ++++++++ .../baeldung/web/SseEmitterController.java | 31 +++++++ .../web/StreamingResponseBodyController.java | 24 ++++++ .../src/main/webapp/WEB-INF/jsp/index.jsp | 86 +++++++++++++++++++ 5 files changed, 198 insertions(+) create mode 100644 spring-5-mvc/src/main/java/com/baeldung/Constants.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java create mode 100644 spring-5-mvc/src/main/webapp/WEB-INF/jsp/index.jsp diff --git a/spring-5-mvc/src/main/java/com/baeldung/Constants.java b/spring-5-mvc/src/main/java/com/baeldung/Constants.java new file mode 100644 index 000000000000..472f3280b7f7 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/Constants.java @@ -0,0 +1,21 @@ +package com.baeldung; + +public class Constants { + + public static final String GENERIC_EXCEPTION = "Exception encountered!"; + + /** + * API endpoints. + */ + public static final String API_RBE = "/rbe"; + public static final String API_SSE = "/sse"; + public static final String API_SRB = "/srb"; + + /** + * API Responses. + */ + public static final String API_RBE_MSG = "I Was Sent From a Response Body Emitter!"; + public static final String API_SSE_MSG = "I Was Sent From a Sse!"; + public static final String API_SRB_MSG = "I Was Sent From a Streaming Response Body!"; + +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java new file mode 100644 index 000000000000..78e33c0a3536 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java @@ -0,0 +1,36 @@ +package com.baeldung.web; + +import com.baeldung.Constants; +import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +@Controller +public class ResponseBodyEmitterController { + + @RequestMapping(Constants.API_RBE) + public ResponseEntity handleRbe() { + ResponseBodyEmitter emitter = new ResponseBodyEmitter(); + ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); + + nonBlockingService.execute(() -> { + try { + emitter.send(Constants.API_RBE_MSG + " @ " + new Date(), MediaType.TEXT_PLAIN); + emitter.complete(); + } catch (Exception ex) { + System.out.println(Constants.GENERIC_EXCEPTION); + emitter.completeWithError(ex); + } + }); + + return new ResponseEntity(emitter, HttpStatus.OK); + } + + +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java new file mode 100644 index 000000000000..ea280e8d36e9 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java @@ -0,0 +1,31 @@ +package com.baeldung.web; +import com.baeldung.Constants; +import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +@Controller +public class SseEmitterController { + + @RequestMapping(Constants.API_SSE) + public SseEmitter handleSse() { + SseEmitter emitter = new SseEmitter(); + + ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); + nonBlockingService.execute(() -> { + try { + emitter.send(Constants.API_SSE_MSG + " @ " + new Date()); + emitter.complete(); + } catch (Exception ex) { + System.out.println(Constants.GENERIC_EXCEPTION); + emitter.completeWithError(ex); + } + }); + + return emitter; + } + +} \ No newline at end of file diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java new file mode 100644 index 000000000000..ab9771aa8d3f --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java @@ -0,0 +1,24 @@ +package com.baeldung.web; + +import com.baeldung.Constants; +import java.util.Date; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; + +@Controller +public class StreamingResponseBodyController { + + @RequestMapping(Constants.API_SRB) + public ResponseEntity handleRbe() { + StreamingResponseBody stream = out -> { + String msg = Constants.API_SRB_MSG + " @ " + new Date(); + out.write(msg.getBytes()); + }; + + return new ResponseEntity(stream, HttpStatus.OK); + } + +} diff --git a/spring-5-mvc/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-5-mvc/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 000000000000..df5baf7adbf2 --- /dev/null +++ b/spring-5-mvc/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,86 @@ +<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + + + Spring MVC Async + " rel="stylesheet"> + + +
+

Spring MVC Async

+
+
+
+
+ + + From 9fd62dd0760f572ba8457718a6b8f7ec846addb7 Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Sun, 8 Jul 2018 21:26:31 +0100 Subject: [PATCH 2/3] Corrected indents and spacing --- .../src/main/java/com/baeldung/model/Foo.java | 2 -- .../baeldung/persistence/DataSetupBean.java | 2 -- .../web/ResponseBodyEmitterController.java | 31 +++++++++---------- .../baeldung/web/SseEmitterController.java | 31 +++++++++---------- .../web/StreamingResponseBodyController.java | 17 +++++----- 5 files changed, 38 insertions(+), 45 deletions(-) diff --git a/spring-5-mvc/src/main/java/com/baeldung/model/Foo.java b/spring-5-mvc/src/main/java/com/baeldung/model/Foo.java index a9ffee14da0b..b06f50b74208 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/model/Foo.java +++ b/spring-5-mvc/src/main/java/com/baeldung/model/Foo.java @@ -49,8 +49,6 @@ public void setName(final String name) { this.name = name; } - // - @Override public int hashCode() { final int prime = 31; diff --git a/spring-5-mvc/src/main/java/com/baeldung/persistence/DataSetupBean.java b/spring-5-mvc/src/main/java/com/baeldung/persistence/DataSetupBean.java index cf78977961f6..fa07555bba83 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/persistence/DataSetupBean.java +++ b/spring-5-mvc/src/main/java/com/baeldung/persistence/DataSetupBean.java @@ -16,8 +16,6 @@ public class DataSetupBean implements InitializingBean { @Autowired private FooRepository repo; - // - @Override public void afterPropertiesSet() throws Exception { IntStream.range(1, 5).forEach(i -> repo.save(new Foo(randomAlphabetic(8)))); diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java index 78e33c0a3536..9545b3cafc43 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java @@ -14,23 +14,22 @@ @Controller public class ResponseBodyEmitterController { - @RequestMapping(Constants.API_RBE) - public ResponseEntity handleRbe() { - ResponseBodyEmitter emitter = new ResponseBodyEmitter(); - ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); + @RequestMapping(Constants.API_RBE) + public ResponseEntity handleRbe() { + ResponseBodyEmitter emitter = new ResponseBodyEmitter(); + ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); - nonBlockingService.execute(() -> { - try { - emitter.send(Constants.API_RBE_MSG + " @ " + new Date(), MediaType.TEXT_PLAIN); - emitter.complete(); - } catch (Exception ex) { - System.out.println(Constants.GENERIC_EXCEPTION); - emitter.completeWithError(ex); - } - }); - - return new ResponseEntity(emitter, HttpStatus.OK); - } + nonBlockingService.execute(() -> { + try { + emitter.send(Constants.API_RBE_MSG + " @ " + new Date(), MediaType.TEXT_PLAIN); + emitter.complete(); + } catch (Exception ex) { + System.out.println(Constants.GENERIC_EXCEPTION); + emitter.completeWithError(ex); + } + }); + return new ResponseEntity(emitter, HttpStatus.OK); + } } diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java index ea280e8d36e9..68b3e0b1fb95 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java @@ -10,22 +10,21 @@ @Controller public class SseEmitterController { - @RequestMapping(Constants.API_SSE) - public SseEmitter handleSse() { - SseEmitter emitter = new SseEmitter(); + @RequestMapping(Constants.API_SSE) + public SseEmitter handleSse() { + SseEmitter emitter = new SseEmitter(); - ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); - nonBlockingService.execute(() -> { - try { - emitter.send(Constants.API_SSE_MSG + " @ " + new Date()); - emitter.complete(); - } catch (Exception ex) { - System.out.println(Constants.GENERIC_EXCEPTION); - emitter.completeWithError(ex); - } - }); - - return emitter; - } + ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); + nonBlockingService.execute(() -> { + try { + emitter.send(Constants.API_SSE_MSG + " @ " + new Date()); + emitter.complete(); + } catch (Exception ex) { + System.out.println(Constants.GENERIC_EXCEPTION); + emitter.completeWithError(ex); + } + }); + return emitter; + } } \ No newline at end of file diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java index ab9771aa8d3f..d3963791f685 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java @@ -11,14 +11,13 @@ @Controller public class StreamingResponseBodyController { - @RequestMapping(Constants.API_SRB) - public ResponseEntity handleRbe() { - StreamingResponseBody stream = out -> { - String msg = Constants.API_SRB_MSG + " @ " + new Date(); - out.write(msg.getBytes()); - }; - - return new ResponseEntity(stream, HttpStatus.OK); - } + @RequestMapping(Constants.API_SRB) + public ResponseEntity handleRbe() { + StreamingResponseBody stream = out -> { + String msg = Constants.API_SRB_MSG + " @ " + new Date(); + out.write(msg.getBytes()); + }; + return new ResponseEntity(stream, HttpStatus.OK); + } } From 1af7b85ae4ee3a2ed5a821e3061c8481a232ec6b Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Mon, 9 Jul 2018 08:45:56 +0100 Subject: [PATCH 3/3] RequestMapping to GetMapping --- .../com/baeldung/web/ResponseBodyEmitterController.java | 4 ++-- .../main/java/com/baeldung/web/SseEmitterController.java | 6 ++++-- .../com/baeldung/web/StreamingResponseBodyController.java | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java index 9545b3cafc43..4af8eb9bd316 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java @@ -8,13 +8,13 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; @Controller public class ResponseBodyEmitterController { - @RequestMapping(Constants.API_RBE) + @GetMapping(Constants.API_RBE) public ResponseEntity handleRbe() { ResponseBodyEmitter emitter = new ResponseBodyEmitter(); ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java index 68b3e0b1fb95..390178aaefd5 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java @@ -1,16 +1,17 @@ package com.baeldung.web; + import com.baeldung.Constants; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @Controller public class SseEmitterController { - @RequestMapping(Constants.API_SSE) + @GetMapping(Constants.API_SSE) public SseEmitter handleSse() { SseEmitter emitter = new SseEmitter(); @@ -24,6 +25,7 @@ public SseEmitter handleSse() { emitter.completeWithError(ex); } }); + return emitter; } diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java index d3963791f685..1722ad85cd2b 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/StreamingResponseBodyController.java @@ -5,13 +5,13 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; @Controller public class StreamingResponseBodyController { - @RequestMapping(Constants.API_SRB) + @GetMapping(Constants.API_SRB) public ResponseEntity handleRbe() { StreamingResponseBody stream = out -> { String msg = Constants.API_SRB_MSG + " @ " + new Date();