【问题标题】:Server-Sent Events on Java Web serverJava Web 服务器上的服务器发送事件
【发布时间】:2016-12-14 12:49:32
【问题描述】:

我有一个使用 Spring Framework 的 Java Web 服务器,我想使用服务器发送事件每秒向 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>

你能帮我解决这个问题吗?

谢谢

【问题讨论】:

  • 这显然不是向客户发送信息的方式。使用SseEmitterStreamingResponseBody 作为结果。
  • 感谢您的信息。我还发现我的代码存在问题,因为我需要在不同的线程中写入打印机。

标签: java spring rest notifications server-sent-events


【解决方案1】:

您需要使用 SseEmitter 来发送事件。请参阅Server-Sent Events with Spring(博客)。

您还应该从单独的线程发送事件(让请求线程返回)。

【讨论】:

  • 谢谢,这真的很有帮助。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2012-12-22
  • 2012-04-22
  • 2015-09-24
  • 2015-06-16
  • 2013-08-20
相关资源
最近更新 更多