【发布时间】:2018-04-10 06:04:54
【问题描述】:
上周我阅读了有关 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')";
}
}
(PS 我知道我首先应该检查处理程序是否成功,然后采取一些措施,但我删除了这个检查以简化代码,如果在 30 秒内没有任何响应,我也会从官方文档中删除异常处理程序)
从上面的代码中,客户端每秒发送一次请求并且不等待响应,但它有一个处理程序,当响应到来时将执行。
'JdbcVertx' 在端口 8080 上侦听,获取请求,在睡眠状态下插入数据库,例如 3 秒(我将 1_000_000 行放入数据库并创建索引以减慢插入时间),然后发送响应,因此每个请求都是非阻塞。
据我所知,vertx 只有一个名为 EventLoop 的线程,来自 jdbcVertx 的事件循环 get reqests 但不会立即返回响应,而是放置了一个处理程序,该处理程序将在 db 插入成功时执行。事件循环如何知道 IO 操作何时完成。我认为它使用这样的东西
if(Thread.currentThread().getState != 'blocked' && sec != 30){
this.object.getHandler().execute();
} else if(sec == 30){
Thread.currentThread.inerrupt();
} else{
sec++;
}
但是我们只有一个线程,当我们有阻塞调用时,它没有线程,只有处理程序。
问题是,事件循环如何知道阻塞操作何时结束以及该执行处理程序的时间
【问题讨论】:
-
老实说,我不明白你的问题是什么......
-
问题是,事件循环如何知道阻塞操作何时结束以及该执行处理程序的时间
标签: java asynchronous vert.x event-loop