2017-11-23 18 views
0

私はVert.xで初心者です。私はそれを呼び出すとVert.xでカスタム非同期操作を実装するにはどうすればよいですか?

例えば、JDBCClientが非ブロック方式

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

を持って、それが本当に非同期です。

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

しかし、ノンブロッキング方式で独自のコンポーネントを実装するにはどうすればよいですか?

これを例として書きますと、非同期に見えません。メソッド本体を実行し、渡されたラムダを呼び出します。

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に伝える方法がありますか?注釈やその他のものはありますか?

+0

:RxJavaそれがどのように機能するかを理解する。そして、Verticlesを試してみてください... –

答えて

2

IO操作またはvert.x APIを呼び出すと、非同期操作を実行すると現在のスレッド(イベントループ)からデタッチされるため、コード、コードスタイルに問題はありません。通常は非同期になります。

あなたのケースでは、CPUバインドコードを実行しているので、非同期では動作せず、指定したとおりにラムダを呼び出すだけです。あなたはいつもrunOnContextでコードをラップすることができ、それは、それはイベントループの次の反復で実行するエンキューます非同期(async)あなたはそれにもかかわらず、必要な場合は、それを作る例:

class MyComponent { 
    public void getSomething(Handler<AsyncResult<String>> handler) { 
    vertx.runOnContext(v -> { 
     String result = someHeavyMethodInThisThread(); 
     handler.handle(Future.succeededFuture(result)); 
    }); 
    } 
} 
あなたはVert.xベースについてお読みください
+0

ありがとう、これは私が何を意味したのですか? –

関連する問題