Close

Spring MVC - ResponseBodyEmitter Examples

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.RequestMapping;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Controller
public class MyWebController {

@RequestMapping("/")
public ResponseBodyEmitter handleRequest () {

final ResponseBodyEmitter emitter = new ResponseBodyEmitter();
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
for (int i = 0; i < 1000; i++) {
try {
emitter.send(i + " - ", MediaType.TEXT_PLAIN);

Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
emitter.completeWithError(e);
return;
}
}
emitter.complete();
});

return emitter;
}
}
Original Post




With ResponseBodyEmitter, the target object is written to response via a compatible HttpMessageConverter.

package com.logicbig.example;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

import java.math.BigDecimal;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Controller
public class MyWebController2 {

@RequestMapping("/test")
public ResponseBodyEmitter handleRequest () {

final ResponseBodyEmitter emitter = new ResponseBodyEmitter();
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
for (int i = 0; i < 1000; i++) {
try {
//an HttpMessageConverter will convert BigDecimal in proper format
emitter.send(new BigDecimal(i));
emitter.send(" - ", MediaType.TEXT_PLAIN);

Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
emitter.completeWithError(e);
return;
}
}
emitter.complete();
});

return emitter;
}
}
Original Post




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.servlet.mvc.method.annotation.ResponseBodyEmitter;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Controller
public class MyWebController3 {

@RequestMapping("/test2")
public ResponseEntity<ResponseBodyEmitter> handleRequest () {

final ResponseBodyEmitter emitter = new ResponseBodyEmitter();
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
for (int i = 0; i < 1000; 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);
}
}
Original Post




See Also