首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring发送事件- ResponseBodyEmitter已经设置完成

Spring发送事件- ResponseBodyEmitter已经设置完成
EN

Stack Overflow用户
提问于 2017-03-16 13:46:09
回答 4查看 9.6K关注 0票数 5

我使用spring 4.3.7.RELEASE来设置服务器发送的事件。并使用@scheduled注释每2秒发送一次消息。这是控制器。

代码语言:javascript
运行
复制
@Controller
public class MySSEController {
    private final SseEmitter sseEmitter = new SseEmitter();
    private int counter = 0;

    @RequestMapping("/ssestream")
    public SseEmitter getRealTimeMessageAction() throws IOException {

        sseEmitter.send("MessageCounter : " + counter);
        return sseEmitter;
    }

    @Scheduled(fixedDelay = 2*1000)
    public void scheduledMsgEmitter() throws IOException
    {
        if(null != sseEmitter) {
            sseEmitter.send("MessageCounter : " + ++counter);
        }
    }

}

我是从eclipse直接在Tomcat 9上运行这个的。应用程序每2次启动并向浏览器发送消息。但是过了一段时间,它停止发送消息,我在eclipse控制台中看到了下面的异常。

代码语言:javascript
运行
复制
Mar 16, 2017 6:57:34 PM org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver handleAsyncRequestTimeoutException
SEVERE: Async timeout for GET [/streaming-web/stream/ssestream]
Mar 16, 2017 6:57:35 PM org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler handleError
SEVERE: Unexpected error occurred in scheduled task.
java.lang.IllegalStateException: ResponseBodyEmitter is already set complete
    at org.springframework.util.Assert.state(Assert.java:70)
    at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.send(ResponseBodyEmitter.java:158)
    at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:107)
    at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:89)
    at com.mycomp.test.controllers.MySSEController.scheduledMsgEmitter(MySSEController.java:25)
    at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我是不是遗漏了什么?请帮我解决这个问题。

EN

Stack Overflow用户

发布于 2022-11-25 08:54:22

记录我得到的有关SSE的信息。

点数:

  • 1.超时默认值为30,当结束时,前端将触发onerror侦听器,后端将命中sseEmitter.onComplete()
  • 2.日程安排,我认为这不是一个发送消息的好工具;我的建议是ScheduledExecutorService

答案:

  • 1. @NeoJhou提到,new SseEmitter(0L)是为我工作的
  • 2.在前端代码中,当发生错误时,“you”可以关闭事件源连接
  • 3.在后端代码中,还需要手动完成()

参考文献:

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42835888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档