在过去的一周中,我阅读了有关Vertx的文档。但是我不理解Vertx处理程序的工作方式。例如:
public class Client extends AbstractVerticle{
@Override
public void start() throws Exception {
final HttpClient httpClient = this.vertx.createHttpClient();
this.vertx.setPeriodic(1000, handler->{
httpClient.getNow(8080, "localhost", "/", responseHandler -> {
System.out.println("response");
});
});
}
}
服务器是:
public class JdbcVertx extends AbstractVerticle{
@Override
public void start() throws Exception {
JDBCClient client = JDBCClient.createNonShared(this.vertx, new JsonObject()
.put("url", "jdbc:postgresql://localhost:5432/test")
.put("user", "user")
.put("password", "password")
.put("driver_class", "org.postgresql.Driver")
.put("max_pool_size", 30));
this.vertx.createHttpServer()
.requestHandler(r -> {
client.getConnection(handler -> {
final SQLConnection connection = handler.result();
connection.execute(execute(), hndlr -> {
connection.close(closehndlr -> {
r.response().putHeader("content-type", "text/html").end("Response");
});
});
});
}).listen(8080);
}
private String execute(){
return "insert into rubish (name) values ('test')";
}
}
(P.S 我知道我应该先检查处理程序是否成功,然后再执行某些操作,但我删除了此检查以简化代码,并且从官方文档中得知如果在30秒内没有任何响应,则处理程序会出现异常)
从上面的代码可以看出,客户端每秒发送一次请求并不等待响应,但它有一个处理程序,当响应到达时将被执行。
'JdbcVertx' 监听8080端口,接收请求,进行插入到数据库中,例如睡眠3秒钟(我将1_000_000行放入数据库并创建索引以减慢插入时间),然后发送响应,因此每个请求都是非阻塞的。
据我所知,vertx只有一个名为EventLoop的线程,jdbcVertx从中获取请求但不立即返回响应,而是放置一个处理程序,该处理程序在数据库插入成功时将被执行。事件循环如何知道IO操作何时完成?我认为它使用类似于以下内容的东西
if(Thread.currentThread().getState != 'blocked' && sec != 30){
this.object.getHandler().execute();
} else if(sec == 30){
Thread.currentThread.inerrupt();
} else{
sec++;
}
但我们只有一个线程,当我们有阻塞调用时,它没有线程,只有处理程序。
问题是,事件循环如何知道阻塞操作何时结束,以及执行处理程序的时间。