我刚开始尝试使用服务器事件,但是遇到了一个谷歌错误信息,我希望能够理解。我很快在网上搜索了一下,但没有找到解释,所以我想可能是我做错了什么。
在服务器端,我有一个简单的servlet,它接受请求并创建一个虚拟的事件创建任务:
private Executor executor = Executors.newSingleThreadExecutor();
public void doGet(final HttpServletRequest request, final HttpServletResponse response)
{
final AsyncContext asynCtx = request.startAsync(request, response);
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/event-stream");
response.setCharacterEncoding("utf-8");
executor.execute(() -> {
boolean run = true;
try
{
while (run)
{
final ServletResponse resp = asynCtx.getResponse();
run = resp != null;
if (resp != null)
{
System.out.println("pushing a server event.");
final PrintWriter writer = asynCtx.getResponse().getWriter();
writer.println("data: {time: " + System.currentTimeMillis() + "}\n");
writer.flush();
}
else
{
System.out.println("stopping beeper, no response object available anymore.");
break; // do not run anymore, we got no response
}
Thread.sleep(2000);
}
}
catch (final Exception e)
{
e.printStackTrace();
}
});
}
在客户端我只需:
$(document).ready(function ()
{
var source = new EventSource("/events");
source.onmessage = function (event)
{
console.log("received event: " + JSON.stringify(event));
document.getElementById("eventContainer").innerHTML += event.data + "<br/>";
};
console.log("start to receive events...")
});
当我加载HTML文件时,它可以正常工作,事件被接收并写入控制台。但30秒后,我会收到一个错误消息:
GET [HttpOfLocalhost]/events net::ERR_INCOMPLETE_CHUNKED_ENCODING
为什么会出现这种情况呢?
然后请求会被中止,并立即开始一个新的请求,以便不会导致应用程序崩溃,但是在控制台上看到错误消息很不好。
我的开发者控制台截图:
请求/响应详情:
时间记录表明,这总是发生在30秒后:
谢谢!