package vertxpack;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.pgclient.PgConnectOptions;
import io.vertx.pgclient.PgPool;
import io.vertx.sqlclient.*;
import java.util.ArrayList;
//链式调用 练习
public class FuturePromiseVerticle extends AbstractVerticle {
//配置连接参数
PgConnectOptions connectOptions = new PgConnectOptions()
.setPort(5432)
.setHost("xx.xx.xx.xx")
.setDatabase("xxxx")
.setUser("xxxx")
.setPassword("xxxx")
.addProperty("search_path", "music");
//配置连接池
PoolOptions poolOptions = new PoolOptions()
.setMaxSize(5);
PgPool client;
Router router;
@Override
public void start(Promise<Void> startPromise) throws Exception {
client = PgPool.pool(vertx,connectOptions,poolOptions);
router = Router.router(vertx);
router.route("/").handler(req->{
req.response()
.putHeader("content-type","text/plain")
.putHeader("charset", "utf-8")
.end("你好,谢谢,我是主页。");
});
router.route("/test/list").handler(req->{
Integer page;
String temp = req.request().getParam("page");
if (temp==null){
page = 1;
}else{
page = Integer.valueOf(temp);
}
Integer offset = (page-1)*3;
this.getCon()
.compose(con->this.getRows(con, offset))
.onSuccess(rows -> {
ArrayList list = new ArrayList<JsonObject>();
rows.forEach(item->{
JsonObject json = new JsonObject();
json.put("id", item.getValue("id"));
json.put("name", item.getValue("name"));
list.add(json);
});
req.response()
.putHeader("content-type","application/json")
.putHeader("charset", "utf-8")
.end("你好,谢谢,我是列表。"+ list.toString());
});
});
//创建http连接
vertx.createHttpServer().requestHandler(router).listen(8888, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
} else {
startPromise.fail(http.cause());
}
});
}
//获取数据库连接
private Future<SqlConnection> getCon(){
Promise<SqlConnection> promise = Promise.promise();
// Get a connection from the pool
client.getConnection(ar1 -> {
if (ar1.succeeded()) {
System.out.println("Connected");
// Obtain our connection
SqlConnection conn = ar1.result();
promise.complete(conn);
}else {
promise.fail(ar1.cause());
System.out.println("Could not connect: " + ar1.cause().getMessage());
}});
return promise.future();
}
//用获取到的连接查询数据库
private Future<RowSet<Row>> getRows(SqlConnection conn, Integer offset){
Promise<RowSet<Row>> promise = Promise.promise();
conn
.preparedQuery("SELECT id,name FROM zc_test limit 3 offset $1")
.execute(Tuple.of(offset), ar2 -> {
// Release the connection to the pool
conn.close();
if (ar2.succeeded()) {
promise.complete(ar2.result());
} else {
promise.fail(ar2.cause());
}
});
return promise.future();
}
}
Vert.X的优雅写法-链式(Future+Promise)
使用Vert.X的Future和Promise实现优雅的链式操作
最新推荐文章于 2024-09-23 17:05:46 发布
该博客介绍了如何在Vert.X中使用Future和Promise进行链式调用来优雅地处理数据库连接和HTTP服务器的创建。示例展示了如何配置连接池,创建HTTP服务器,以及通过Promise获取数据库连接并进行查询操作。最后,展示了如何将查询结果转换为JSON对象并返回给客户端。
2331





