前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat NIO(19)-开启异步

Tomcat NIO(19)-开启异步

作者头像
TA码字
发布2021-01-12 11:14:14
7060
发布2021-01-12 11:14:14
举报
文章被收录于专栏:TA码字TA码字

上一篇文章中我们主要介绍 tomcat nio 中的服务端事件 SSE,在这里我们主要介绍 tomcat 中的异步。对于异步处理来说,主要包括异步的开启,异步的执行,异步的结束,异步的超时以及整个异步处理的状态流转,本文我们主要介绍异步的开启。

异步的开启:

对于异步的使用,我们一般有如下代码:

代码语言:javascript
复制
public void testAsync(HttpServletRequest request, HttpServletResponse response) {
    try{
        AsyncContext context = request.startAsync();
        context.start(new Runnable(){
            @Override
            public void run() {
                /**
                 * Do you own logic here in business thread and set final result into response
                 */
                //Complate asyn thread
                context.complete(); 
            }});
    }catch(Exception ex){
        //Handle exception here 
    }
}

HttpServletRequest 的 startAsync() 方法开启了我们的异步调用。

开启异步的流程:

对于 request.startAsync() 的源码调用序列图如下:

从 HttpServletRequest 的 startAsync() 方法开始,调用到异步上下文对象的 setStarted() 方法,一直再调用到 AsyncStateMachine 对象的 asyncStart() 方法。对于 HttpServletRequest 对象的 startAsync() 方法如下:

上述逻辑首先判断是否支持异步,不支持则抛异常。

创建异步上下文对象,该上下文对象属于 HttpServletRequest 实例。

通过 getConnector().getAsyncTimeout() 来设置异步超时时间, 对于超时时间源码默认为 30 秒,所以如果我们的异步任务有可能大于 30 秒的时候要注意重新设置超时时间。

调用异步上下文对象的 setStarted() 方法来开启异步,该方法源码如下:

运行异步 listener 的 start 事件函数。

源码分析对于 start 事件是执行不到的,因为此时构建出的异步上下文对象里,里并没有设置 listener ,所以不会执行 start 的事件函数。

通过继续调用之前文章中介绍的 tomcat request action(ActionCode.ASYNC_START,this) 方法,最终会调到 AsyncStateMachine 对象实例的 asyncStart() 方法。

AsyncStateMachine 对象实例的 asyncStart() 方法源码如下:

根据以前文章 AsyncStateMachine 对象实例属于Http11Processor 类,该 processor 用来处理包装底层 socket 的 NioChannel 对象。所以异步请求的所有状态都通过 AsyncStateMachine 保存维护的。

AsyncStateMachine 对象中异步的初始状态为 AsyncState.DISPATCHED,通过开启异步改变其状态为 AsyncState.STARTING。

对于异步开启的总结如下:

  • 异步调用的开启从 HttpServletRequest 对象的 startAsync() 方法开始,最终到异步状态机 AsyncStateMachine 对象的 asyncStart() 方法。
  • 开启异步并不会触发异步 listener 的 start 事件,因为开启异步构造的上下文对象并没有设置 listener(可能 tomcat 异步实现者并没有考虑这个问题)。
  • 异步调用的所有状态由 AsyncStateMachine 对象来保持维护,该类属于Http11Processor 对象,每个Http11Processor 对像关联处理一个底层 socket,通过这种方式来关联异步状态机和请求。
  • AsyncStateMachine 对象中异步的初始状态为 AsyncState.DISPATCHED,通过开启异步改变其状态为 AsyncState.STARTING。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档