Экземпляр Vertx не инициализируется при использовании Kotlin сопрограмм - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь записать HTTP-сервер, используя Vert.x CoroutineVerticle, но получаю сообщение об ошибке lateinit property vertxInstance has not been initialized. Похоже, что функция init(...) из CoroutineVerticle не вызывается, когда вертикаль развернута.

package http

import io.vertx.core.DeploymentOptions
import io.vertx.core.Vertx
import io.vertx.ext.web.Router
import io.vertx.kotlin.core.http.listenAwait
import io.vertx.kotlin.coroutines.CoroutineVerticle

class CoTest : CoroutineVerticle() {
    private var router = createRouter()

    override suspend fun start() {

        vertx.createHttpServer()
            .requestHandler(router)
            .listenAwait(config.getInteger("http.port", 8182))
    }

    private fun createRouter() = Router.router(vertx).apply {
        get("/favicon.ico").handler { req ->
            req.response().end("NO")
        }
    }
}
fun main() {    
    class V : ServerVertxCo(8182) {}
    Vertx.vertx().deployVerticle(CoTest::class.java.canonicalName)
}

1 Ответ

1 голос
/ 02 августа 2020

Проблема заключается в том, в каком порядке вы делаете что-то в своем классе.

Порядок для vertx:

  1. Создание экземпляра vertx
  2. Развертывание вершины
  3. Вызывается конструктор класса вершины (vertx еще не "внедрен" в него)
  4. Vertx выполняет некоторые внутренние инициализации
  5. Vertx вызывает функцию start вершины

Вы используете private var router = createRouter() в классе (за пределами блока start), и в этот момент vertx еще не «введен» в класс, поэтому вы получаете исключение.

Если вы перемещаете его в блок start, он должен работать так, как вы ожидаете:

class CoTest : CoroutineVerticle() {

  override suspend fun start() {
    val router = createRouter()

    vertx.createHttpServer()
      .requestHandler(router)
      .listenAwait(config.getInteger("http.port", 8182))
  }

  private fun createRouter() = Router.router(vertx).apply {
    get("/favicon.ico").handler { req ->
      req.response().end("NO")
    }
  }
}

suspend fun main() {
  val vertx = Vertx.vertx()
  vertx.deployVerticleAwait(CoTest::class.java.canonicalName)
}
...