支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用( 四 )

  • 最后是用于对比的常规web服务类PoolPersonResource.java,这个就是中规中矩的在线程池中取一个线程来执行响应代码
package com.bolingcavalry.resource;import com.bolingcavalry.model.Person;import com.bolingcavalry.repository.PersonRepositoryAsyncAwait;import io.smallrye.common.annotation.RunOnVirtualThread;import javax.inject.Inject;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;@Path("/pool/persons")public class PoolPersonResource {@InjectPersonRepositoryAsyncAwait personRepository;@GET@Path("/{id}")public Person getPersonById(@PathParam("id") Long id) {return personRepository.findById(id);}}
  • 至此,编码完成
IDEA启动设置
  • 编码完成后,在IDEA上启动应用做本地调试是咱们的基本操作,所以IDEA运行环境也要设置成支持JDK19的预览特性
  • 打开入口类,点击main方法前面的绿色箭头,在弹出的菜单上选择Modify Run Configuration

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 在运行应用的设置页面,如下操作

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 选中Add VM options

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 填入下图箭头所指的内容

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 终于,设置完成,接下来要启动应用了
启动和验证
  • 启动应用之前,请确认postgresql数据库已启动,并且数据已经导入,具体启动和导入方法请参考前文
  • 点击下图红色箭头中指向的按钮,即可在IDEA中运行应用

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 浏览器访问地址:http://localhost:8080/vt/persons/1,如下图,符合预期

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 在前文中,咱们是在docker上运行应用的,另外在实际场景中应用运行在docker或者k8s环境也是普遍情况,所以接下来一起实战将用做成docker镜像并验证
构建镜像
  • 在创建工程的时候,IDEA就用quarkus模板自动创建了多个Dockerfile文件,下图红框中全是

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 如果当前应用的JDK不是19,而是11或者17,那么上图红框中的Dockerfile文件就能直接使用了,然而,由于今天咱们应用的JDK必须是19,就无法使用这些Dockerfile了,必须自己写一个,原因很简单,打开Dockerfile.jvm,如下图红色箭头所示,基础镜像是jdk17,而这个仓库中并没有JDK19,也就是说quarkus还没有发布JDK19版本的基础镜像,咱们要自己找一个,另外,容器启动命令也要调整,需要加入--enable-preview才能开启JVM的虚拟线程

支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

文章插图
  • 自己写的Dockerile文件名为Dockerfile.19,内容如下,可见非常简单:先换基础镜像,再把mvn构建结果复制过去,最后加个启动命令就完事儿了(远不如官方的分层构建节省空间,然而在官方的JDK19镜像方案出来之前,先用下面这个将就着用吧)
FROM openjdk:19ENV LANGUAGE='en_US:en'# 执行工作目录WORKDIR applicationCOPY --chown=185 target/*.jar ./RUN mkdir configEXPOSE 8080USER 185ENTRYPOINT ["java", "-jar", "--enable-preview", "quarkus-virual-threads-demo-1.0-SNAPSHOT-runner.jar"]