以下代码存在问题,如果我删除Thread.sleep(1000);
,则会得到不一致的结果。我不想使用Thread.Sleep(1000);
当我使用vertx的异步操作时,我想等到rowSet填满数据。
请帮助 预先谢谢...!
import io.vertx.pgclient.RgPool;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.RowSet;
class TestAsyncOperation{
private RowSet<Row> rowSet;
public RowSet<Row> getResult(){
PgPool conn = DbConfig.getConnection();// consider db connections is received
String qry = "select col1 as column1, col2 as column2 from SomeTable";
conn.query(qry).execute(asyncResult -> {
if(asyncResult.succeeded()){
rowSet = asyncResult.result();
}else{
throw new Exception(asyncResult.cause().getMessage());
}
Thread.sleep(1000);
if(Optional.ofNullable(rowSet).isPresent){
return rowSet;
}else{
return null;
}
});
}
}
答案 0 :(得分:0)
您只能使用Java Future功能来处理结果,但是,如果您使用的是可以在eventLoop中运行的vertx方法executeBlocking
,但是它需要很短的时间,您可以使用仅将一个线程使用整个线程的工作线程IMO,您应该考虑使用反应性方法,使用Java 9中的反应性库RxJava,您可以订阅dabatase更改并进行工作,vert.x提供了一个Rxjava插件btw。 / p>
答案 1 :(得分:0)
对于并行活动(线程和异步过程)之间的通信,简单变量不适合。 相反,应使用数据流变量,例如期货:
PgPool conn = DbConfig.getConnection();// consider db connections is received
String qry = "select col1 as column1, col2 as column2 from SomeTable";
CompletableFuture<RowSet<Row>> rowSet = new CompletableFuture<RowSet<Row>>();
conn.query(qry).execute(asyncResult -> {
if(asyncResult.succeeded()){
rowSet.complete(asyncResult.result());
}else{
rowSet.completeExceptionally(asyncResult.cause());
}
});
try {
return rowSet.get();
} catch (Exception e) {
return null;
}