簡體   English   中英

如何在Vert.x中實現自定義異步操作?

[英]How can I implement custom asynchronous operation in Vert.x?

我是Vert.x的新手。

例如, JDBCClient具有非阻塞方法

JDBCClient.getConnection(Handler<AsyncResult<SQLConnection>> handler)

當我調用它時,它實際上是異步的。

jdbcClient.getConnection(result -> { /* this code will execute asynchonous */})

但是,如何使用非阻塞方法實現自己的組件?

當我寫這個例子時,它看起來並不異步。 它只會執行方法體,然后將調用傳遞的lambda。

 class MyComponent { 
   public void getSomething(Handler<AsyncResult<String>> handler) {
       String result = someHeavyMethodInThisThread();
       handler.handle(Future.succeededFuture(result));
   }
 }
 /* later */

 /* this code will be blocking, right? */
 myComponent.getSomething(res -> { /* ... */ })

也許有辦法告訴Vert.x我的方法應該是異步的? 一些注釋或其他什么?

您的代碼沒有任何問題,您的代碼樣式通常是異步的,因為您執行IO操作或調用vert.x API時,異步操作會將您從當前線程(事件循環)中分離出來。

在你的情況下,你正在使用CPU綁定代碼,因此它不會表現為async,因為你所說的只是調用lambda。 如果你想讓它異步,你總是可以用runOnContext包裝你的代碼,並將它排入runOnContext以在事件循環的下一次迭代中運行,例如:

class MyComponent { 
  public void getSomething(Handler<AsyncResult<String>> handler) {
    vertx.runOnContext(v -> {
      String result = someHeavyMethodInThisThread();
      handler.handle(Future.succeededFuture(result));
    });
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM