我刚刚开始玩服务器事件,遇到了一条我想了解的 chrome 错误消息。我很快在网上搜索,但没有找到解释,所以我想我可能做了一些非常错误的事情。
在服务器端,我有一个简单的 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
why?
该请求会被终止,并立即启动一个新请求,因此它不会终止应用程序,但控制台上的错误消息并不好。
我的开发者控制台的屏幕截图:
请求/响应详细信息:
计时,这表明它总是在 30 秒后发生:
Thanks!