0

我正在使用带有 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)
    }
4

1 回答 1

1

我想我设法重现并解决了您的问题。
想知道为什么你没有收到很多来自 Quasar 的异常。它应该提醒某些东西没有检测到。

问题出在这一行:

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

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

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

但是该类缺少方法@Suspendable注释handle

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

class MyHandler(private val vertx: Vertx) : Handler<RoutingContext> {

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

不如原来的那么好,但这不应该让 Quasar 感到困惑。

于 2017-12-24T19:24:34.040 回答