4

我正在使用 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 推送部分响应。

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

4

1 回答 1

0

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

于 2013-06-04T22:35:02.160 回答