[英]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.