SseEmitter Spring MVC返回传输关闭,剩余未完成的读取数据

时间:2018-01-10 15:43:36

标签: java spring spring-mvc

我有一个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)转移已关闭且剩余未完成的读取数据

我无法弄清问题在哪里。

1 个答案:

答案 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>