【发布时间】:2015-10-24 10:36:28
【问题描述】:
我在 tomcat 8.0 上使用 java 尝试了 SSE(服务器发送事件)。以下是我注意到的几件事。
我单击了一个按钮,该按钮自动向 servlet 发出请求。 Servlet 的 GET 方法被执行,该方法返回一个事件流。一旦接收到完整的流,页面再次自动发出另一个请求,再次接收相同的数据!!!我那里没有无限循环!!!
服务器上实际发生了什么?在正常情况下,tomcat 会创建一个线程来处理每个请求。现在发生了什么?
确保事件流只发送一次到同一个连接/浏览器会话的正确方法是什么?
确保事件流关闭且服务器上没有资源开销的正确方法是什么?
如何区分 GET 和 POST 请求。为什么选择 GET?
在 Tomcat 上使用 SSE 是否为时过早?有任何性能问题吗?
这里是好奇的代码,
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//content type must be set to text/event-stream
response.setContentType("text/event-stream");
//cache must be set to no-cache
response.setHeader("Cache-Control", "no-cache");
//encoding is set to UTF-8
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
for(int i=0; i<10; i++) {
System.out.println(i);
writer.write("data: "+ i +"\n\n");
writer.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
writer.close();
}
}
页面上的Javascript(页面上没有其他内容),
<button onclick="start()">Start</button>
<script type="text/javascript">
function start() {
var eventSource = new EventSource("TestServlet");
eventSource.onmessage = function(event) {
console.log("data: "+event.data)
document.getElementById('foo').innerHTML = event.data;
};
}
</script>
使用 CURL 进行了尝试。回应只来了一次。我用的是chrome,所以这一定是chorme的问题??
编辑:
我学到的和学习的东西现在记录在我的博客中 - Server Sent Events
【问题讨论】:
-
可能是您的浏览器。尝试使用 curl 发送初始请求,看看它是否仍然发生。
-
是的,你是对的。 Curl 因一个请求而停止。
-
我爱上了同一个...至少我能够为您节省时间和挫败感;)
-
@John 我认为浏览器没有问题。我从过去 6-8 个月开始使用这种想法,并且在生产中运行良好。检查您的脚本可能是 start() 被多次调用?
-
@Amogh 但这怎么可能呢?我评论了代码并放置了一个console.log,当我单击按钮时它只被调用一次。如果您已经使用了几个月,那么您可能会回答我的问题。
标签: java tomcat server-sent-events tomcat8