使用 Jetty 12 演示 Ktor 中的虚拟线程支持


这是使用虚拟线程在 Jetty 12 上运行 Ktor 的演示

背景:
我花了足够长的时间研究反应式数据库驱动程序等,并受到这个问题 的启发,我决定构建一个 POC,使用 Jetty 12 演示 Ktor 中的虚拟线程支持。其中大部分是改编自现有 Ktor Jetty 引擎的代码,但是我已经完全放弃了 servlet 支持,这应该是运行 Jetty 的最快方式

它应该非常容易使用,添加 dep 并启动​​服务器,如下所示:

fun main(args: Array<String>) {
    val config = CommandLineConfig(args)
    EmbeddedServer(config.applicationProperties, Jetty12) { takeFrom(config.engineConfig) }.start(true)
}

该软件包包含将 Jetty 12 与 Ktor 集成的机制,以及在虚拟线程上进行调度的线程调度器。这让你可以做很多看起来奇怪但有趣的事情,比如在不阻塞操作系统线程的情况下使用 runBlocking {},以及使用使用 ThreadLocal 的库。

已知限制

  • 基于 Ktor 3.0.0-beta1 构建。这使得它与 2.x.x 不兼容,也不支持 Kotlin 4 中将要使用的新 kotlinx IO 库。
  • 我尝试过的大多数 HTTP 1.1 请求似乎都能正常工作,但 HTTPX/websocket 支持几乎肯定无法正常工作。
  • vthread Dispatcher 可以工作,但我不知道这是否是个好主意。
  • 仅限 Java 21+
  • initializeServer()一团糟