2017-12-09 5 views
0

저는 Kotlin 언어로 Vertx 웹과 verticle을 사용하여 웹 서비스 프로젝트를 작성하고 있습니다. 콜 아웃 지옥에 들어가기를 막기 위해 Vertx Sync로 전환하려고 할 때, 내 코드의 일부분이 이유없이 두 번 이상 실행됩니다. 이전 콜백 구조를 사용할 때 그런 문제는 없습니다. 최대한 빨리 다음 줄이 여러 번 실행 "PersisLayer"라인을 넣어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 
    }) 

: 이것은 몇 가지 예제 코드입니다. 이 줄을 생략하면 다음 줄이 한 번 실행됩니다. 내가 재현하고 문제를 해결하기 위해 관리 생각

 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) 
    } 
+0

문제는이 부분이 아니지만 "PersistLayer"리스너에서 수행하는 작업과 관련이 있습니다. 너도 그걸 올리시겠습니까? –

+0

@AlexeySoshin 그러나 PersistLayer 코드는 너무 간단해서 문제가되지 않습니다. 코드를 추가했습니다. – Kamyar

+0

감사. 한눈에 코드가 잘 보입니다. 아마도 Quasar-> VertX Sync-> Kotlin 사이에 무언가가있을 수 있습니다. 나는 이것을 하루나 이틀에 재현하려고 노력할 것입니다. –

답변

1

: 여기

는 PersistLayer 코드입니다.
퀘이사에서 많은 예외를받지 못한 이유가 궁금합니다. 그것은 무언가가 계측되지 않았 음을 경고 했어야합니다.

문제는이 라인에 있습니다

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

fiberHandler은 실제로 당신이 암시 적으로 여기에 구현 핸들러를받습니다.

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

하지만 클래스는 handle 방법에 @Suspendable 주석이 없습니다.

그래서, 대신 블록을 지정하는 것이 바람직 별도의 파일에 별도의 클래스를 만들고, 그는 다음과 같이 보입니다 : 원래 하나

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()) 
    } 
} 

같은 좋은하지,하지만 그래도 준성을 혼동하지 말아야 .