Vertxを使用してTCPサーバーを実装しようとしています。着信接続を受け入れてから別のソケットを処理しています。各ソケットは独立して扱うことができるので、異なるソケットに属するハンドラは、異なるイベントループスレッドで同時に実行されるはずです。それらが作成され、開始メソッドは、そのイベントループで呼び出されたとき着信NetSocketハンドラを異なるイベントループスレッドにディスパッチする方法は?
はVert.x documentによれば、
標準verticlesはイベントループスレッドを割り当てられます。イベントループからコアAPI上のハンドラを受け取る他のメソッドを呼び出すと、Vert.xはそれらのハンドラが呼び出されると、同じイベントループで実行されることを保証します。
私はこのコードスニペットは、異なるスレッド名を印刷することができ、思う:
Vertx vertx = Vertx.vertx(); // The number of event loop threads is 2*core.
vertx.createNetServer().connectHandler(socket -> {
vertx.deployVerticle(new AbstractVerticle() {
@Override
public void start() throws Exception {
socket.handler(buffer -> {
log.trace(socket.toString() + ": Socket Message");
socket.close();
});
}
});
}).listen(port);
しかし残念ながら、すべてのハンドラが同じスレッドに位置していました。
23:59:42.359 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.364 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.365 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.366 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.367 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.368 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.369 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.370 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
... more than 100+ lines ...
逆の例は、this echo server written in BOOST.ASIOに似ています。スレッドプールを使用してio_service::run()
を実行すると、ハンドラは異なるイベントループスレッドで実行されます。
私の質問はこれらのハンドラを同時に実行する方法です。
まだ分かりませんでした。コードと私の違いは、作業者の頂点を配置する場所です。私はそれらをハンドラにデプロイしながら、それらを外部にデプロイします。これは、いくつかのハンドラに配備された頂点が、ハンドラを配備するスレッドを継承することを意味しますか?そうなら、それは本当に意図されていますか? –
リクエストごとに頂点を作成しています。あなたはそうしてはいけません。頂点はスレッドを継承しません。私の例を実行すると、同じ方法で頂点を作成していますが、毎回別のスレッドが得られることがわかります。あなたが同じスレッドにいると思う理由はおそらくあなたがあなたのネットクライアントをどう扱うかです。しかしそれは別の問題です。 –
なぜそれをしてはいけないのですか?違いは何ですか?私はvert.xドキュメントでそれを見つけることができません、または私はその実装を読む必要があります。 :) –