Я искал, чтобы ответить на такой же вопросы, когда дело доходит до SSE, вот мое исследование:
У меня есть основной javax HttpServlet, который будет печатать данные в PrintWriter каждые Rando секунд.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
System.out.println("You just entered the doGetMethod");
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = null;
while(true){
try{
System.out.println("You just entered the while loop");
double randomNumber = Math.random()*10000;
printWriter = response.getWriter();
printWriter.print("data: " + "[next server time check event in " +
Math.round(randomNumber/1000) + " seconds]\n");
printWriter.print("data: " + "Time: " + Calendar.getInstance().getTime() + "\n\n");
response.flushBuffer();
Thread.sleep((long)randomNumber);
} catch (IOException | InterruptedException e){
e.printStackTrace();
break;
}
}
System.out.println("Connection was aborted");
}
и вот скрипт, который заполняет {текстовой идентификатор = "displayTextArea} элемент
<script>
var eventSource = null;
function start(){
eventSource = new EventSource('http://localhost:8080/SSEServlet');
eventSource.onopen = function(){displayTextArea.value+='Connected ..' + '\n';};
eventSource.onmessage = function(message){displayTextArea.value+=message.data + '\n\n';};
eventSource.onerror = function(){displayTextArea.value+='Error Occurred...' + '\n';};
}
function stop(){
eventSource.close();
}
function clearText(){
displayTextArea.value = '';
}
</script>
- Чтобы ответить на ваш первый вопрос:
Если вы смотрите консоль при запуске приложение, вы заметите, что консоль не печатает «Вы только что ввели doGetMethod» до тех пор, пока вы не отправите HTTP-запрос GET в путь сервлета. Это подтверждает понимание того, что экземпляр Servlet и объекты req/resp не создаются, пока кто-то не вызовет сервлет. How do servlets work?
- Второй и третий вопрос:
Tomcat по умолчанию назначит один поток для каждого соединения (Source). В моей текущей конфигурации моя программа будет максимальной в 6 соединениях. Каждое соединение создаст свой собственный экземпляр сервлета, и пока соединение открыто, оно останется в цикле while. Это было доказано, когда я запускал сервер и открывал отдельные соединения, видя разные времена и последовательность случайных интервалов.Мой цикл while не бесконечен, хотя он ждет, пока соединение не будет закрыто, а затем генерирует исключение и прерывает цикл while. После закрытия соединения сервлет закроется.
Способ, которым я это сделал, очень любительский способ выполнения SSE. Если вы хотите изучить передовые библиотеки для этого я хотел бы проверить jeaSSE
Если кто-то хочет полностью code