如何集成AJAX和JavaEEServlet3异步响应
我正在考虑如何使AJAX利用Servlet3异步响应。在请求-响应同步处理模型中,当响应返回时,XmlHttpRequest的回调可以得到响应文本;但是,如果响应在另一个线程中处理,并返回一些消息,那么当请求结束时,XHR将得到什么呢?它还能得到响应体吗?我尝试了一个简单的代码来测试它,似乎没有得到响应 我可以理解这一点,当AJAX请求返回时,响应中没有任何内容,它将在另一个服务器线程中延迟,因此回调将一无所获如何集成AJAX和JavaEEServlet3异步响应,java,ajax,servlet-3.0,Java,Ajax,Servlet 3.0,我正在考虑如何使AJAX利用Servlet3异步响应。在请求-响应同步处理模型中,当响应返回时,XmlHttpRequest的回调可以得到响应文本;但是,如果响应在另一个线程中处理,并返回一些消息,那么当请求结束时,XHR将得到什么呢?它还能得到响应体吗?我尝试了一个简单的代码来测试它,似乎没有得到响应 我可以理解这一点,当AJAX请求返回时,响应中没有任何内容,它将在另一个服务器线程中延迟,因此回调将一无所获 但是我想知道有没有办法让AJAX得到正确的响应?恐怕我以前犯了一个错误,在异步处理完
但是我想知道有没有办法让AJAX得到正确的响应?恐怕我以前犯了一个错误,在异步处理完成后,我忘记调用asycontext.complete()。调用complete()后,ajax将获得响应。但是,如果处理持续时间超过超时设置,则会出现异常,表明asynccontext的状态非法,客户端将一无所获:
final AsyncContext ac = request.startAsync();
ac.setTimeout(1000);
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
PrintWriter pw;
try {
Thread.sleep(2000);
pw = ac.getResponse().getWriter();
pw.write("Hello, World!");
ac.complete();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
所以我猜这里的关键是:1。处理完成后呼叫完成;2.设置适当的超时时间 请看这里了解更多信息。我通读了这篇文章,它似乎与我的问题无关。实际上,我想在客户端使用AJAX,而在服务器端使用Servlet3异步处理。但是,在处理完成后,如何从服务器获取响应呢?有可能吗?这篇文章确实谈到了这一点。关键是持久的http连接。这里有一个关于它的教程,谢谢,这是我想要的。然而,读完这篇文章后,我觉得Servlet3异步处理使AJAX处理更加复杂。但它确实有效。我不确定它是否比现在更复杂。显然,这不是解决所有问题的办法。如果我知道AJAX调用需要一段时间才能响应(长时间运行的存储过程或类似的东西),我会使用它。这样,我就不会锁定该线程,而是使用持久HTTP连接返回响应。