2016-12-14 151 views
0

我有一個使用Spring Framework的Java Web服務器,我想使用Server Sent Events在每秒向Web客戶端發送通知。在Java Web服務器上發送服務器事件

我的控制器,用於這些通知看起來像這樣:

@Controller 
public class NotificationController { 

    private static final String REST_PREFIX = "/rest/notifications"; 

    @RequestMapping(value = {REST_PREFIX}, method = {RequestMethod.GET}) 
    synchronized public void getMonitoringNotifications(HttpServletRequest request, HttpServletResponse response) { 
     response.setContentType("text/event-stream;charset=UTF-8"); 
     response.setHeader("Cache-Control", "no-cache"); 
     response.setHeader("Connection", "keep-alive"); 

     try { 
      PrintWriter out = response.getWriter(); 
      int i = 0; 

      while (true) { 
       out.print("id: " + "ServerTime" + "\n"); 
       out.print("data: " + (i++) + "\n\n"); 
       out.flush(); 

       Thread.currentThread().sleep(1000); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我的問題是,代替1秒後接收每個通知,客戶端等待要被髮送的所有通知。 如果我嘗試發送一些通知,比如30,在客戶端我會在最後收到它們。

我的客戶是一個簡單的,因爲它只監聽特定端點接收通知:

<!DOCTYPE html> 
<html> 
<body> 
<h1>Notification received : </h1> 

<div id="ServerTime"></div> 

<script> 
    if (typeof (EventSource) !== "undefined") { 
    var source = new EventSource("https://10.241.53.185/rest/notifications"); 
    source.addEventListener('message', function(event) { 
    console.log(event.data); 
    }); 
    } else { 
    document.getElementById("ServerTime").innerHTML = "Working, processing, getting info...."; 
    } 
</script> 

</body> 
</html> 

能否請你幫我這個問題?

謝謝

+1

這顯然不是向客戶端發送信息的方式。作爲結果,使用'SseEmitter'或'StreamingResponseBody'。 –

+0

感謝您的信息。我還發現我的代碼存在問題,因爲我需要在不同的線程中寫入打印機。 – Ancuta

回答

1

您需要使用SseEmitter發送事件。見Server-Sent Events with Spring(博客)。

您還應該從單獨的線程發送事件(讓請求線程返回)。

+0

謝謝,這真的很有幫助。 – Ancuta