Kotlin Vertx同步代码运行多次

Kotlin Vertx同步代码运行多次,kotlin,vert.x,vertx-verticle,Kotlin,Vert.x,Vertx Verticle,我正在使用VertxWeb和带有Kotlin语言的verticles编写一个web服务项目。当我尝试切换到Vertex Sync以停止进入回调地狱时,我的代码的某些部分会毫无原因地多次运行。当使用旧的回调结构时,不存在这样的问题。这是一些示例代码: router.post("/layers").handler(fiberHandler { routingContext -> val request = routingContext.request() val

我正在使用VertxWeb和带有Kotlin语言的verticles编写一个web服务项目。当我尝试切换到Vertex 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
    })
router.post(“/layers”).handler(fiberHandler{routingContext->
val request=routingContext.request()
val response=request.response()
response.putHeader(“内容类型”、“应用程序/json”)
val layer=gson.fromJson(routingContext.bodyAsString,layer::class.java)
val layerResult=waitresult{vert.eventBus().send(“PersistLayer”,layer,it)}
val viewResult=waitresult{vert.eventBus().send(“CreateView”,layerResult.body(),it)}
response.isChunked=true
write(gson.toJson(viewsult.body()))
response.statusCode=201
})
一旦我把“波斯杀手”列出来,下一行就会运行多次。省略此行时,下一行运行一次

下面是持久层代码:

        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)
    }
vert.eventBus().consumer(“PersistLayer”).handler{
val layer=it.body()
layer.sid=Generators.timeBasedGenerator().generate()
entityManager.apply{
事务处理。开始()
持久化(层)
commit()事务
}
it.reply(layer.sid)
}

我想我设法重现并解决了您的问题。
想知道为什么你没有收到很多来自类星体的例外。它应该已经警告某些东西没有被检测

问题出在这一行:

router.post("/layers").handler(fiberHandler { routingContext -> ...
fiberHandler
实际上接收一个处理程序,您在这里隐式实现它

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

虽然不如原来的那个好,但这不应该混淆Quasar。

问题可能不在于这一部分,而在于您在“PersistLayer”侦听器中所做的工作。你也可以发布它吗?@AlexeySoshin但是PersistLayer代码太简单了,不会有问题。我添加了代码。谢谢。乍一看,您的代码看起来不错。也许在类星体->顶点同步->科特林之间的某些东西会出现问题。我会试着在一两天内重现这一点。。如果不是用Java编程,为什么要使用Vert.x Sync?@tsegismont你称之为协同程序支持吗?这与添加了“启动”功能的同步相同!这是一个非常糟糕的支持!别管它!瞎扯!
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())
    }
}