2、Ktor學習-自動重新載入;

Melrose發表於2019-03-04

   在開發過程中,快速反饋迴圈週期非常重要。 通常,重新啟動伺服器可能需要一些時間,因此Ktor提供了一個基本的自動過載工具,可以重新載入Application類。

注:自動過載不支援java 9,如果要使用該功能則需要使用JDK8;

類改變時自動重新載入

  在這兩種情況下,使用embeddedServer或配置檔案時,您必須提供一個與您要監視的類載入器相匹配的監視子字串列表。

  例如,使用gradle時的典型類載入器如下所示:

/Users/user/projects/ktor-exercises/solutions/exercise4/build/classes/kotlin/main
複製程式碼

  在這種情況下,您可以使用solutions/exercise4字串或者僅使用exercise4字串,它將匹配該類載入器。

使用embeddedServer

  使用自定義主伺服器和embeddedServer時,可以使用可選引數watchPaths提供將被監視和重新載入的子路徑列表。

fun main(args: Array<String>) {
    embeddedServer(
        Netty,
        watchPaths = listOf("solutions/exercise4"),
        port = 8080,
        module = Application::mymodule
    ).apply { start(wait = true) }
}

fun Application.mymodule() {
    routing {
        get("/plain") {
            call.respondText("Hello World!")
        }
    }
}
複製程式碼

通過application.conf配置

  使用配置檔案時,例如使用EngineMain從命令列執行或託管在伺服器容器中:要啟用此功能,請將watch的key新增到ktor.deployment配置。

 watch  - 應該監視並自動重新載入的類路徑條目的陣列。
 
 ktor {
    deployment {
        port = 8080
        watch = [ module1, module2 ]
    }
    
    …
}
 
複製程式碼

  現在,watch鍵只是與contains相匹配的字串,與載入的應用程式中的類路徑條目相對應,例如jar名稱或專案目錄名稱。 然後使用特殊的ClassLoader載入這些類,該類在檢測到更改時被回收。

注:類路徑條目看起來像file:/path/to/project/build/classes/myproject.jar,所以/ project會匹配,但com.mydomain不會。

在原始碼更改時自動重新編譯

  由於自動過載功能僅檢測類檔案中的更改,因此您必須自己編譯應用程式。 你可以在執行時使用IntelliJ IDEA和Build - > Build Project來實現。

  但是,您也可以使用gradle自動檢測源更改併為您編譯。 您只需在專案資料夾中開啟另一個終端並執行:gradle -t build。 它將編譯應用程式,在執行此操作後,它將偵聽其他源更改並在必要時重新編譯。 因此,觸發自動類重新載入。 然後,您可以使用另一個終端以gradle run執行應用程式。

例子

  您可以使用build.gradle或直接在IDE中執行應用程式。 執行示例檔案中的main方法,或執行:io.ktor.server.netty.EngineMain.main。 使用commandLineEnvironment的EngineMain將負責載入application.conf檔案(即HOCON格式)。


main.kt

package io.ktor.exercise.autoreload

import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

// Exposed as: `static void io.ktor.exercise.autoreload.MainKt.main(String[] args)`
fun main(args: Array<String>) {
    //io.ktor.server.netty.main(args) // Manually using Netty's EngineMain
    embeddedServer(
        Netty, watchPaths = listOf("solutions/exercise4"), port = 8080,
        module = Application::module
    ).apply { start(wait = true) 
}

// Exposed as: `static void io.ktor.exercise.autoreload.MainKt.module(Application receiver)`
fun Application.module() {
    routing {
        get("/plain") {
            call.respondText("Hello World!")
        }
    }
}
複製程式碼

application.conf

ktor {
    deployment {
        port = 8080
        watch = [ solutions/exercise4 ]
    }

    application {
        modules = [ io.ktor.exercise.autoreload.MainKt.module ]
    }
}
複製程式碼

相關文章