- 刚才说好的兵分两路,先看VIRTUAL_EXECUTOR_SUPPLIER是什么,再看RuntimeDeploymentManager#deploy()方法
- 该方法内容很多,咱们还是只看虚拟线程有关的,如下图,VIRTUAL_EXECUTOR_SUPPLIER成了runtimeResourceDeployment的成员变量,然后针对每个bean的每个方法,都要执行一次箭头4指向的buildResourceMethod方法,此方法是关键,接下来重点看

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

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

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

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

文章插图
- 打开run方法,豁然开朗,前面咱们看到为web接口方法绑定handler,这里会取出handler依次执行
经验总结扩展阅读
- LAL v0.32.0发布,更好的支持纯视频流
- ipadmini6屏幕刷新率_ipadmini6支持120刷新率吗
- ubantu18.04@Intel 82545EM 【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机
- iphone5g手机有哪些 哪些手机支持5g
- ipadpencil一代支持机型 支持ipadpencil一代的机型有哪些
- 一加AcePro有红外线吗 一加AcePro支持红外功能吗
- 一加AcePro支持无线充电吗 一加AcePro有无线充电功能吗
- 一加AcePro支持nfc功能吗 一加AcePro有nfc功能吗
- 华为freebudspro2支持音频连接中心吗 有音频连接中心吗
- opporeno5有没有nfc功能 oppo支持nfc功能吗
