2017-12-09 19 views
0

私はVertxウェブとKotlin言語の頂点を使用してWebサービスプロジェクトを作成しています。私がコールバック地獄に入るのを止めるためにVertx Syncに切り替えようとすると、私のコードのいくつかの部分が理由なしで2回以上実行されます。古いコールバック構造を使用する場合、そのような問題はありません。これはいくつかのサンプルコードです: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」行を置くとすぐ次の行が複数回実行されます。この行を省略すると、次の行が1回実行されます。ここで

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

問題はおそらくこの部分ではなく、 "PersistLayer"リスナーで何をするかによって決まります。投稿してもらえますか? –

+0

@AlexeySoshinしかし、PersistLayerコードは問題がありすぎるほど簡単です。私はコードを追加しました。 – Kamyar

+0

ありがとうございます。一目でコードがよく見えます。おそらくQuasar-> VertX Sync-> Kotlinの間に何かがあるかもしれません。私はこれを1日か2日後に再現しようとします。 –

答えて

1

私が再現し、あなたの問題を解決するために管理さだと思います。
なぜあなたはQuasarから多くの例外を受け取っていないのか不思議です。それは何かが装備されていないことを警告していたはずです。

問題は、この行である:

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

として良くないが、それはしかしクエーサーを混同してはなりません。

関連する問題