SpringBoot中异步请求的使用

作用:可以先释放请求线程的资源,提高系统的吞吐量

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使用了状态机的形式  后续有时间继续查看源码

当然,请求线程可以提前结束。

 


版权声明:本文为ma_ru_long原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。