Javascript 什么是触发SSE错误事件
我有一个服务SSE数据的servletJavascript 什么是触发SSE错误事件,javascript,java,server-sent-events,Javascript,Java,Server Sent Events,我有一个服务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代码:
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:
在下面的评论建议我需要使用异步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
无限期。您是否使用
AsyncContext
获取您的响应及其编写器?否则,刷新后连接将关闭,并触发错误
event.Wow。因此,在使用SSE时,我们必须使用AsyncContext?首先调用writer.write(“data:blah”)代码>是否也不需要行尾?即:writer.write(“数据:blah\n\n”)代码>@RamRaider对此不确定。我认为如果它是一个延续,我们需要附加“\n”,但即使没有“\n”似乎对我也适用。@John您可以不使用它,但它将关闭连接,客户端代码将重新连接(并在这之前抛出一个漂亮的错误
)。我建议使用AsyncContext。有关更多详细信息,请参阅。是否使用AsyncContext
获取响应及其编写器?否则,刷新后连接将关闭,并触发错误
event.Wow。因此,在使用SSE时,我们必须使用AsyncContext?首先调用writer.write(“data:blah”)代码>是否也不需要行尾?即:writer.write(“数据:blah\n\n”)代码>@RamRaider对此不确定。我认为如果它是一个延续,我们需要附加“\n”,但即使没有“\n”似乎对我也适用。@John您可以不使用它,但它将关闭连接,客户端代码将重新连接(并在这之前抛出一个漂亮的错误
)。我建议使用AsyncContext。有关更多详细信息,请参阅。