我有一个SpringMVC项目,我在其中一个REST控制器中使用SseEmitter。 以下是代码:
@RequestMapping(path = "/finite/{count}", method = RequestMethod.GET)
public SseEmitter getFiniteMessages(@PathVariable int count){
LOG.info("Request received for finite messages.");
final SseEmitter emitter = new SseEmitter();
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
for (int i = 0; i < count; i++) {
try {
emitter.send(LocalTime.now().toString() , MediaType.TEXT_PLAIN);
Thread.sleep(200);
} catch (Exception e) {
LOG.error(e.getMessage());
emitter.completeWithError(e);
return;
}
}
emitter.complete();
});
return emitter;
}
但是当我正在卷曲时,即
curl -X GET http://localhost:8080/score/sse/finite/4
我正在
curl:(18)转移已关闭且剩余未完成的读取数据
我无法弄清问题在哪里。
答案 0 :(得分:1)
我解决了这个问题。 我在web.xml文件中添加了以下标记。
<async-supported>true</async-supported>
这允许Servlet存储传入的请求以供以后响应,就像我用于发送Server Sent Event一样。
这是完整的servlet映射。
<servlet>
<servlet-name>score</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/spring-servlet.xml</param-value>
</init-param>
<async-supported>true</async-supported>
</servlet>