我正在使用 Tomcat 7。当我的异步 servlet 尝试以不同的时间间隔向客户端推送部分响应时,它不起作用。只有在整个响应准备好后才会刷新响应。
如何推送部分响应?
这是我的代码
@WebServlet(urlPatterns={"/home"} , name="asynch", asyncSupported=true)
public class CometServlet extends HttpServlet {
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
{
final AsyncContext ac = request.startAsync();
new MyThread(ac).start();
}
}
MyThread所做的是它会定期将 1 到 10 的数字写入响应对象。
class MyThread extends Thread
{
AsyncContext ac;
public MyThread( AsyncContext ac ) {
this.ac = ac;
}
public void run()
{
int i =2 ;
while( i < 10 )
{
try
{
ac.getResponse().getWriter().print(i + "\n" );
ac.getResponse().getWriter().flush();
ac.getResponse().flushBuffer();
Thread.sleep(1000);
}
catch (Exception e) {
System.out.println("ccttt " + e);
}
i++;
}
ac.complete();
}
}
以及请求 servlet 的页面
<script type="text/javascript">
function show()
{
var xml = new XMLHttpRequest();
xml.open("GET", "http://localhost:8080/Comet/home", true );
xml.onreadystatechange=function()
{
if (xml.readyState== 3|| xml.readyState == 4 ) {
document.getElementById("dynamicContent").innerHTML=xml.responseText;
}
}
xml.send(null);
}
</script>
<input type="button" value="show" onclick="show()"/>
<div id="dynamicContent"> </div>
大约 10 秒后,我在浏览器上看到了完整的响应。但我想每秒看到部分输出。
我想学习的是如何使用 Servlet 3 API 推送部分响应。
有人可以回答这个问题吗?