2016-12-14 1 views
0

나는 스프링 프레임 워크를 사용하는 자바 웹 서버를 가지고 있으며 서버 보낸 이벤트를 사용하여 매초마다 웹 클라이언트에게 알림을 보내려고한다. 이러한 알림자바 웹 서버의 서버 - 보낸 이벤트

내 컨트롤러는 다음과 같습니다

@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(); 
     } 
    } 
} 

내 문제는 모든 알림이 전송되는 대신 일초 후 각 알림을 수신에, 클라이언트가 대기하는 것입니다. 많은 알림을 보내려고하면 고객에게 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

관련 문제