我有一个简单的 vert.x 应用程序:
public class Main {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(40).setInternalBlockingPoolSize(40));
Router router = Router.router(vertx);
long main_pid = Thread.currentThread().getId();
Handler<ServerWebSocket> wsHandler = serverWebSocket -> {
if(!serverWebSocket.path().equalsIgnoreCase("/ws")){
serverWebSocket.reject();
} else {
long socket_pid = Thread.currentThread().getId();
serverWebSocket.handler(buffer -> {
String str = buffer.getString(0, buffer.length());
long handler_pid = Thread.currentThread().getId();
log.info("Got ws msg: " + str);
String res = String.format("(req:%s)main:%d sock:%d handlr:%d", str, main_pid, socket_pid, handler_pid);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
serverWebSocket.writeFinalTextFrame(res);
});
}
};
vertx
.createHttpServer()
.websocketHandler(wsHandler)
.listen(8080);
}
}
当我将此服务器与多个客户端连接时,我发现它在一个线程中工作。但我想并行处理每个客户端连接。我应该如何更改此代码才能做到这一点?
最佳答案
这个:
new VertxOptions().setWorkerPoolSize(40).setInternalBlockingPoolSize(40)
看起来您正在尝试创建自己的 HTTP 连接池,这可能不是您真正想要的。
Vert.x
和其他基于事件循环
的非阻塞框架的想法是,我们不尝试 1 线程 -> 1 connection
affinity,而是,当当前由事件循环线程服务的请求正在等待 IO - 例如来自 DB 的响应 - 该事件循环线程被释放以服务于另一个连接。然后,这允许单个事件循环线程以类似并发的方式为多个连接提供服务。
如果你想充分利用你机器上的所有核心,并且你只打算运行一个verticle
,那么在部署你的时候将实例数设置为核心数垂直。
浏览器
Vertx.vertx().deployVerticle("MyVerticle", new DeploymentOptions().setInstances(Runtime.getRuntime().availableProcessors()));
关于java - Vert.x 多线程网络套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941393/