支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程( 三 )

  • 至此,咱们算是搞清楚这个executor是啥了:用Executors.newVirtualThreadPerTaskExecutor()创建的Executor实例,虽然是用反射,但本质上得到的结果和JDK方法的推荐做法一致
  • 其次,RuntimeDeploymentManager#deploy方法里是什么?
    • 刚才说好的兵分两路,先看VIRTUAL_EXECUTOR_SUPPLIER是什么,再看RuntimeDeploymentManager#deploy()方法
    • 该方法内容很多,咱们还是只看虚拟线程有关的,如下图,VIRTUAL_EXECUTOR_SUPPLIER成了runtimeResourceDeployment的成员变量,然后针对每个bean的每个方法,都要执行一次箭头4指向的buildResourceMethod方法,此方法是关键,接下来重点看

    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    文章插图
    • 展开上图箭头4的方法,原来如此,注意箭头指向的method.isRunOnVirtualThread(),这个在前面已经分析过了,咱们用@isRunOnVirtualThread修饰过的web接口,在这里返回的值就是true,就会执行箭头2所指的代码,为此web接口添加一个handler,从名字上看,这个blockingHandlerVirtualThread和之前咱们一直关注的VIRTUAL_EXECUTOR_SUPPLIER应该有不小的关系

    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    文章插图
    • 看RuntimeResourceDeployment的构造方法,果然VIRTUAL_EXECUTOR_SUPPLIER是blockingHandlerVirtualThread构造方法的入参

    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    文章插图
    • 至此就要先打住了,不要急着看BlockingHandler的代码,那里面的东西是在处理web请求时才会执行,到目前为止咱们的重点还只是分析Executors.newVirtualThreadPerTaskExecutor()方法创建的executor去了哪里,现在就小结一下吧
    • 一图胜千言,本篇最核心的Executor对象的诞生过程,由一个主线逻辑和两个支线逻辑组成,如下图,红色代表主线任务,它负责遍历所有web接口对应的方法,发现该方法需要用虚拟线程执行时,就为此方法绑定一个BlockingHandler对象,这个handler的成员变量中,就有直线逻辑用JDK19特定的方法创建出来的虚拟线程特有的executor对象,至于这个handler对象怎么用?就是本篇的另一半重要内容了:执行虚拟线程

    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    文章插图
    • 至此,本篇的第二个重要问题:这个特别的Executor对象是哪来的,这个问题已经弄明白了(好像一句话就能说清楚:放入了和web接口方法关联的handler中),接下来是最后一个问题:这个特别的Executor对象应该怎么用?
    这个特别的Executor对象应该怎么用?
    • 由于虚拟线程是在处理web响应的时候被用到的,所以分析这个特别的Executor对象时,不可避免的进入了quarkus处理web响应的复杂逻辑中,之所以说复杂,因为这里面最底层涉及到netty,再往上又涉及到vertx库,如果咱们从头去看会严重偏离主题,所以接下来分析web响应的代码时,我这边就尽量简化了
    • 代码分析中RestInitialHandler#beginProcessing方法开始吧,对于反应式web服务,每次请求都会执行此方法,如下图,红色箭头指向的ResteasyReactiveRequestContext对象需要重点关注,这里面放置了本次web请求的相关信息,接下来就会执行此对象的run方法

    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    文章插图
    • 打开run方法,豁然开朗,前面咱们看到为web接口方法绑定handler,这里会取出handler依次执行
    【支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程】
    支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    经验总结扩展阅读