我正在使用带有 Kotlin 语言的 Vertx Web 和 Verticles 编写一个 Web 服务项目。当我尝试切换到 Vertx Sync 以停止进入回调地狱时,我的代码的某些部分会无缘无故地运行不止一次。使用旧的回调结构时没有这样的问题。这是一些示例代码:
router.post("/layers").handler(fiberHandler { routingContext ->
val request = routingContext.request()
val response = request.response()
response.putHeader("content-type", "application/json")
val layer = gson.fromJson<Layer>(routingContext.bodyAsString, Layer::class.java)
val layerResult = awaitResult<Message<UUID>> { vert.eventBus().send("PersistLayer", layer, it) }
val viewResult = awaitResult<Message<Long>> { vert.eventBus().send("CreateView", layerResult.body(), it) }
response.isChunked = true
response.write(gson.toJson(viewResult.body()))
response.statusCode = 201
})
一旦我输入“PersisLayer”行,下一行就会运行多次。省略此行时,下一行运行一次。
这是 PersistLayer 代码:
vert.eventBus().consumer<Layer>("PersistLayer").handler {
val layer = it.body()
layer.sid = Generators.timeBasedGenerator().generate()
entityManager.apply {
transaction.begin()
persist(layer)
transaction.commit()
}
it.reply(layer.sid)
}