I have a servlet serving SSE data
writer.write("data: Time is ");
writer.write(Calendar.getInstance().getTime().toString()+"\n\n");
System.out.println("Error state of the stream: " + writer.checkError()); //prints false
response.flushBuffer();
And here is my javascript code:
var eventSource = null;
function start() {
if (!!window.EventSource) {
eventSource = new EventSource("SSESyncServlet");
} else {
// Result to xhr polling :(
}
eventSource.addEventListener('message', function(event) {
document.getElementById('dataFromServer').innerHTML = event.data;
});
eventSource.addEventListener('open', function(e) {
console.log("connection opened event");
});
eventSource.addEventListener('error', function(e) {
console.log("connection error event");
});
}
Not sure what's causing it but I get the error event in the javascript after the message event.
UPDATE 1:
After the suggestion from the comments below that I need to use Async servlets, the server side code is modified.
final AsyncContext aCtx = request.startAsync();
final PrintWriter writer = response.getWriter();
System.out.println("Request Received");
Runnable runnable = new Runnable() {
@Override
public void run() {
writer.write("data: Time is \n");
writer.write("data: "+Calendar.getInstance().getTime().toString()+"\n\n");
System.out.println("Error state of the stream: " + writer.checkError());
writer.flush();
aCtx.dispatch();
}
};
Thread t = new Thread(runnable);
t.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
But now even after I close the connection from client side. The server side code continues to run.
Server keeps printing
Request Received
Error state of the stream: true
indefinitely.