Servlet 3:异步 - 无法推送部分响应

时间:2013-01-26 21:24:48

标签: java servlets java-ee push servlet-3.0

我正在使用Tomcat 7.当我的异步servlet以不同的时间间隔尝试 PUSH 对客户端的部分响应时,它不起作用。只有在整个响应准备就绪后才会刷新响应。 / p>

如何推动部分回应?

这是我的代码

@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推送部分响应。

有人可以回答这个问题吗?

1 个答案:

答案 0 :(得分:0)

请参阅my answer,了解另一个问题中提到的完全相同的问题。 如果您在按照该答案中的说明操作后仍然遇到此问题,请告诉我。