我在考虑如何让AJAX使用servlet 3异步响应。在请求 - 响应同步处理模型中,当响应返回时,XmlHttpRequest的回调可以获得响应文本;但是如何在另一个线程中处理响应,并返回一些消息,XHR在请求结束时会得到什么?还能得到反应机构吗?我尝试了一个简单的代码来测试它,似乎没有得到响应;
我可以理解这一点,当AJAX请求返回时,响应中没有任何内容,它将在另一个服务器线程中被延迟,因此回调什么也得不到。
但我想知道有没有办法让AJAX得到正确的答案?
答案 0 :(得分:0)
我恐怕之前犯了一个错误,我忘了在异步处理完成后调用asycContext.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.设置适当的超时;