Я попробовал SSE (Server-Sent-Events) с помощью java на tomcat 8.0. Вот несколько вещей, которые я заметил.
Я нажимаю кнопку, которая автоматически делает запрос на сервлет. Выполняется метод GET сервлета, который возвращает поток событий. Как только полный поток будет получен, страница снова автоматически сделает другой запрос, который снова получит те же данные!!! У меня нет бесконечного цикла!
-
Что на самом деле происходит на сервере? В обычных сценариях tomcat создает поток для обработки каждого запроса. Что происходит сейчас?
-
Каков правильный способ гарантировать, что поток событий отправляется только один раз в тот же сеанс соединения/браузера?
-
Каков правильный способ убедиться, что поток событий закрыт, и на сервере не наложены служебные данные?
-
Как различать запросы GET и POST. Почему он выбрал GET?
-
Слишком рано использовать SSE на Tomcat? Любые проблемы с производительностью?
Вот код для любознательного,
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//content type must be set to text/event-stream
response.setContentType("text/event-stream");
//cache must be set to no-cache
response.setHeader("Cache-Control", "no-cache");
//encoding is set to UTF-8
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
for(int i=0; i<10; i++) {
System.out.println(i);
writer.write("data: "+ i +"\n\n");
writer.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
writer.close();
}
}
Javascript на странице (у меня больше ничего нет на странице),
<button onclick="start()">Start</button>
<script type="text/javascript">
function start() {
var eventSource = new EventSource("TestServlet");
eventSource.onmessage = function(event) {
console.log("data: "+event.data)
document.getElementById('foo').innerHTML = event.data;
};
}
</script>
Пробовал это, используя CURL. И ответ пришел только один раз. Я использую хром, так что это должна быть проблема с chorme??
EDIT:
То, что я узнал и изучаю, теперь задокументировано в моем блоге - События, отправленные сервером