Será tarde para opinar? ya pasaron casi 10 años de está pregunta, acabo de tener precisamente esté problema y se resuelve teniendo la conexión abierta, fácil como un bucle, pero hay que precisar que esto sería para ser usado más como un socket que como una petición al servidor:
@WebServlet("/events")
public class SSEServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("1");
resp.setContentType("text/event-stream");
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Cache-Control", "no-store");
resp.setHeader("Connection", "keep-alive");
resp.setStatus(HttpServletResponse.SC_OK);
while(true) {
PrintWriter writer = resp.getWriter();
writer.write("data: Evento disparado desde SSE\n\n");
writer.checkError();
writer.flush();
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(SSEServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}