我有一个服务于SSE数据的servlet
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();
这是我的javascript代码:
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");
});
}
不确定是什么导致它,但我在消息事件后的javascript中收到了错误事件。
更新1:
根据以下评论的建议,我需要使用Async servlet,修改服务器端代码。
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();
}
但是现在甚至在我从客户端关闭连接之后。服务器端代码继续运行。
服务器保持打印
Request Received
Error state of the stream: true
无限期。