作用:可以先释放请求线程的资源,提高系统的吞吐量
AsyncContext asyncContext = request.startAsync(); // 创建一个异步上下文对象
asyncContext.addListener(new AsyncListener() { //设置监听器:可设置其开始、完成、异常、超时等事件的回调处理
@Override
public void onTimeout(AsyncEvent event) throws IOException {
System.out.println("超时了...");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
System.out.println("线程开始");
}
@Override
public void onError(AsyncEvent event) throws IOException {
System.out.println("发生错误:"+event.getThrowable());
}
@Override
public void onComplete(AsyncEvent event) throws IOException {
System.out.println("执行完成");
}
});
asyncContext.setTimeout(20000); //设置超时时间
asyncContext.start(new Runnable() {
public void run() {
try {
Thread.sleep(10000);
System.out.println("内部线程:" + Thread.currentThread().getName());
asyncContext.getResponse().setCharacterEncoding("utf-8");
asyncContext.getResponse().setContentType("text/html;charset=UTF-8");
asyncContext.getResponse().getWriter().println("这是异步的请求返回"); //异步请求完成通知
} catch (Exception e) {
System.out.println("异常:"+e);
}
asyncContext.complete(); //此时整个请求才完成
}
});
//此时之类 request的线程连接已经释放了
System.out.println("主线程:" + Thread.currentThread().getName());
创建一个异步请求的上下文对象(AsyncContextImpl),存储request response 设置回调,超时时间等
AsyncContextImpl启动了一个异步的runnable ,这个runnable对象,是在 processor.getExecutor().execute(runnable)启动
asyncStateMachine 异步sevlet使用了状态机的形式 后续有时间继续查看源码
当然,请求线程可以提前结束。
本文详细解析了异步Servlet的工作原理,包括如何通过AsyncContext创建异步上下文,设置监听器处理开始、完成、异常和超时事件,以及如何启动异步任务并设置超时时间。同时介绍了异步请求上下文对象AsyncContextImpl的内部机制。
695

被折叠的 条评论
为什么被折叠?



