Vertx同步代码运行多次

我正在使用Kotlin语言编写一个使用Vertx Web和Verticle的Web服务项目。 当我尝试切换到Vertx同步停止进入回调地狱,我的代码的一些部分运行不止一次没有理由。 当使用旧的回调结构时,不存在这样的问题。 这是一些示例代码:

router.post("/layers").handler(fiberHandler { routingContext -> val request = routingContext.request() val response = request.response() response.putHeader("content-type", "application/json") val layer = gson.fromJson(routingContext.bodyAsString, Layer::class.java) val layerResult = awaitResult<Message> { vert.eventBus().send("PersistLayer", layer, it) } val viewResult = awaitResult<Message> { vert.eventBus().send("CreateView", layerResult.body(), it) } response.isChunked = true response.write(gson.toJson(viewResult.body())) response.statusCode = 201 }) 

只要我把“PersisLayer”行,下一行运行多次。 当省略这一行时,下一行将运行一次。

这是PersistLayer代码:

  vert.eventBus().consumer("PersistLayer").handler { val layer = it.body() layer.sid = Generators.timeBasedGenerator().generate() entityManager.apply { transaction.begin() persist(layer) transaction.commit() } it.reply(layer.sid) } 

我想我设法重现和解决你的问题。
不知道为什么你没有收到很多来自Quasar的例外。 它应该已经提醒,有些东西没有装备。

问题在于这一行:

 router.post("/layers").handler(fiberHandler { routingContext -> ... 

fiberHandler实际上接收一个处理程序,你在这里隐式实现。

 // That's what you actually do class SomeHandler : Handler { override fun handle(event: RoutingContext?) { } } 

但是,该类在handle方法上缺少@Suspendable注释。

所以,而不是指定一个块,创建一个单独的类,最好在一个单独的文件,看起来像这样:

 class MyHandler(private val vertx: Vertx) : Handler { @Suspendable override fun handle(req: RoutingContext?) { val result = Sync.awaitResult>({ vertx.eventBus().send("someAddress", "Hi", it) }) println("Got response") val result2 = Sync.awaitResult>({ vertx.eventBus().send("someAddress", "Hi", it) }) println("Got second response") req?.response()?.end(result.body() + result2.body()) } } 

不如原来的那么好,但是不应该混淆Quasar。