事件源连接无法在远程主机上保持活动状态

时间:2020-07-17 14:54:59

标签: javascript java spring-boot rest

问题

我在Spring-Boot中有一个Rest API,在这里我像这样监听来自html的事件源流:

 eventSource = new EventSource("/api/events/receive", {
        xhrHeaders: {
            'Content-Type': 'text/event-stream',
            'Connection': 'keep-alive'
        }
    });
 eventSource.onmessage = function (evt) { ... };

一段时间后,EventSource返回503!


在本地主机上完美运行,但在远程主机上不是


我尝试过的事情

  • 通过@RestController对象在HttpServletResponse上添加保持活动状态
@GetMapping(path = "/api/events/receive", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
        public Flux<Ambulance> receiveAmbulance(HttpServletResponse resp) {
            
            resp.addHeader("Connection", "keep-alive");
            

            return Flux.create(sink -> {
                ambulanceProcessor.register(sink::next);
            });
        }
        
  • 通过keep-alive@Controller标头添加到该模板
@GetMapping("/dashboard")
    public String getResource(Model model, HttpServletResponse response) {
            response.addHeader("Connection", "keep-alive");
            return "view";
}

我访问过的相关帖子

  1. How SSE Work
  2. SSE Spring Examples

503几秒钟后

enter image description here

注意:我已经尝试了几乎所有内容,但似乎没有任何效果...

1 个答案:

答案 0 :(得分:1)

我通过使用此@Service创建新的@Bean

来使其保持生命

@Bean
    public void KeepAliveEvt()
    {
        ExecutorService sseMvcExecutor = Executors.newSingleThreadExecutor();
        sseMvcExecutor.execute(() -> {
            try {
                for (int i = 0; true; i++) {
                    Thread.sleep(120000);
                    ambulanceProcessor.process(new Event());
                    System.out.println("Kept Alive");
                    
                }
            } catch (Exception ex) {
              
            }
        });
    }

基本上,我每2分钟进行一次虚拟事件,使其保持活力