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