↗ JetBrains 20% discount
Buy any product from JetBrains and get a 20% discount.
Spring MVC
ResponseBodyEmitter is used for HTTP streaming.
package com.logicbig.example;import org.springframework.http.MediaType;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;@Controllerpublic class MyWebController { @GetMapping(value = "/test") public ResponseBodyEmitter handleRequest() { final ResponseBodyEmitter emitter = new ResponseBodyEmitter(); ExecutorService service = Executors.newSingleThreadExecutor(); service.execute(() -> { for (int i = 0; i < 100; i++) { try { emitter.send(i + " - ", MediaType.TEXT_PLAIN); Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); emitter.completeWithError(e); return; } } emitter.complete(); }); return emitter; }}
ResponseBodyEmitter can be used as the body of ResponseEntity:
package com.logicbig.example;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.bind.annotation.RequestParam;import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;@Controllerpublic class MyWebController2 { @RequestMapping("/test2") public ResponseEntity<ResponseBodyEmitter> handleRequest( @RequestParam(value = "count", defaultValue = "500") int count) { final ResponseBodyEmitter emitter = new ResponseBodyEmitter(); ExecutorService service = Executors.newSingleThreadExecutor(); service.execute(() -> { for (int i = 0; i < count; i++) { try { emitter.send(i + " - ", MediaType.TEXT_PLAIN); Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); emitter.completeWithError(e); return; } } emitter.complete(); }); return new ResponseEntity(emitter, HttpStatus.OK); }}