Kotlin Vertx同步代码运行多次
我正在使用VertxWeb和带有Kotlin语言的verticles编写一个web服务项目。当我尝试切换到Vertex Sync以停止进入回调地狱时,我的代码的某些部分会毫无原因地多次运行。当使用旧的回调结构时,不存在这样的问题。这是一些示例代码: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
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())
}
}