Vert.X的优雅写法-链式(Future+Promise)

该博客介绍了如何在Vert.X中使用Future和Promise进行链式调用来优雅地处理数据库连接和HTTP服务器的创建。示例展示了如何配置连接池,创建HTTP服务器,以及通过Promise获取数据库连接并进行查询操作。最后,展示了如何将查询结果转换为JSON对象并返回给客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
  }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值