↗ JetBrains 20% discount
Buy any product from JetBrains and get a 20% discount.
Spring MVC
StreamingResponseBody is used for asynchronous request processing where the application can write directly to the response OutputStream.
package com.logicbig.example;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import java.io.IOException;import java.io.OutputStream;@Controllerpublic class TestController { @GetMapping("/test") public StreamingResponseBody handleRequest() { return new StreamingResponseBody() { @Override public void writeTo(OutputStream out) throws IOException { for (int i = 0; i < 50; i++) { out.write((i + " - ").getBytes()); out.flush(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } }; }}
StreamingResponseBody can be used with ResponseEntity:
package com.logicbig.example;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import java.io.IOException;import java.io.OutputStream;@Controllerpublic class TestController2 { @GetMapping("/test2") public ResponseEntity<StreamingResponseBody> handleRequest () { StreamingResponseBody responseBody = new StreamingResponseBody() { @Override public void writeTo (OutputStream out) throws IOException { for (int i = 0; i < 50; i++) { out.write((Integer.toString(i) + " - ") .getBytes()); out.flush(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } }; return new ResponseEntity(responseBody, HttpStatus.OK); }}
package com.logicbig.example;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import java.io.ObjectOutputStream;import java.math.BigInteger;import java.util.HashMap;import java.util.Map;@Controllerpublic class MyController { @GetMapping("/test") public StreamingResponseBody handleRequest() { return outputStream -> { Map<String, BigInteger> map = new HashMap<>(); map.put("one", BigInteger.ONE); map.put("ten", BigInteger.TEN); try (ObjectOutputStream oos = new ObjectOutputStream(outputStream)) { oos.writeObject(map); } }; }}
package com.logicbig.example;import jakarta.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import java.io.IOException;import java.io.OutputStream;@Controllerpublic class MyWebController2 { @GetMapping("/test2") public StreamingResponseBody handleRequest(HttpServletRequest r) { System.out.println("asyncSupported: " + r.isAsyncSupported()); System.out.println(Thread.currentThread().getName()); return new StreamingResponseBody() { @Override public void writeTo(OutputStream outputStream) throws IOException { System.out.println(Thread.currentThread().getName()); outputStream.write("from test request".getBytes()); } }; }}