Vertx3入门应用

github地址:https://github.com/vert-x3


2、获取配置文件
 private void getConfig(Future<JsonObject> future) {
    Vertx configVertx = Vertx.vertx();
    configVertx.fileSystem().readFile(configDir + File.separator + "config.json",
        res -> {
          if (res.succeeded()) {
            Buffer buf = res.result();
            JsonObject config = buf.toJsonObject();
            configVertx.close(re -> {
              if (re.succeeded()) {
                future.complete(config.getJsonObject("config"));
              } else {
                future.fail(re.cause());
              }
            });
          } else {
            future.fail(res.cause());
          }
     });
  }
3、创建vertx集群环境
private void createVertx(Future<Void> future) {
      VertxOptions options = new VertxOptions();
       options.setClustered(true);
       ClusterManager mgr = new ZookeeperClusterManager();
      options.setClusterHost("10.12.12.210");//本机zk地址
     options.setClusterPort(clusterPort);
     options.setClusterManager(mgr);
      Vertx.clusteredVertx(options, res -> {
        if (res.succeeded()) {
          vertx = res.result();
          future.complete();
        } else {
          future.fail(res.cause());
        }
      });
    
  }




4、注册一个编解码器到eventbus:主要用于实体传输时的编解码
 vertx.eventBus().registerDefaultCodec(Result.class, new ResultCodec());
 


5、部署verticle
private void deploy(String name, Handler<AsyncResult<String>> handler) {
    if (config != null) {
       DeploymentOptions deploymentOptions =
          new DeploymentOptions().setConfig(config).setInstances(1).setWorker(true);
      vertx.deployVerticle(name, deploymentOptions, result -> {
        if (result.succeeded()) {
          String deployId = result.result();
          handler.handle(Future.succeededFuture(deployId));
          System.out.println(name + " 部署成功 ");
        } else {
          handler.handle(Future.failedFuture(result.cause()));
          System.out.println(name + " 部署失败  " + result.cause().getMessage());
        }
      });
    } else {
      handler.handle(Future.failedFuture("Config is null"));
      log.error(name + " 部署失败 ");
    }
  }


ManageVerticle
public class ManageVerticle extends AbstractVerticle {
  protected Logger log = LoggerFactory.getLogger(this.getClass().getName());


  private JsonObject config;
  private ManageHandler manageHandler;
  private Router mainRouter;
  
  @Override
  public void init(Vertx vertx, Context context) {
    super.init(vertx, context);
    this.config = context.config();
   this.mainRouter = Router.router(vertx);
  }


  @Override
  public void start(Future<Void> future) {
    consumerListen();
    addMyRoute();
    future.complete();
  }


  @Override
  public void stop(Future<Void> future) {
    future.complete();
  }


  private void consumerListen() {
    vertx.eventBus().consumer("user-create", manageHandler()::create);
    vertx.eventBus().consumer("user-get", manageHandler()::get);
    vertx.eventBus().consumer("user-update", manageHandler()::update);
    vertx.eventBus().consumer("user-delete", manageHandler()::delete);
  }




  private void addMyRoute() {
    HttpServerOptions options = new HttpServerOptions();
    options.setPort(config().getInteger("http.port", 8081));
    HttpServer server = vertx.createHttpServer(options);
    server.requestHandler(configMainRouter()::accept);


    server.listen(result -> {
      if (result.succeeded()) {
       
        future.complete();
      } else {
       
        future.fail(result.cause());
      }
    });
  }
private Router configMainRouter() {


    mainRouter.route().failureHandler(ErrorHandler.create(true));
    /* Session / cookies for users */
    AuthProvider authProvider = MyAuthProvider.create(vertx, config);
    mainRouter.route().handler(CookieHandler.create());
    mainRouter.route().handler(
        SessionHandler.create(LocalSessionStore.create(vertx)).setNagHttps(false));
    mainRouter.route().handler(UserSessionHandler.create(authProvider));
     //二级子路由
  Router  subRouter = Router.router(vertx);
   subRouter.route(HttpMethod.POST, "/getuser").handler(
        new Dispatcher<Result>(MyRequestHandler()::getUser)::dispatchRequest);
    mainRouter.mountSubRouter("/manage/",subRouter);


    return mainRouter;
  }


  private ManageHandler manageHandler() {
    if (manageHandler == null) {
      manageHandler = new ManageHandler(vertx, config);
    }
    return manageHandler;
  }


}




ManageHandler
public class ManageHandler {
  protected Logger log = LoggerFactory.getLogger(this.getClass().getName());
  private Vertx vertx;
  private JsonObject config;
  private ManageDao dao;


  public ManageHandler(Vertx vertx, JsonObject config) {
    this.vertx = vertx;
    this.config = config;
    this.dao = new ManageDao(vertx, config);
  }
  //consumer
  public void getuser(Message<?> msg) {
    Future<JsonObject> future = Future.future();
    future.setHandler(r -> {
      if (r.succeeded()) {
        msg.reply(Result.succeedResult(r.result()));
      } else {
        msg.reply(Result.failResult("101", r.cause().getMessage()));
      }
    });
    JsonObject body = (JsonObject) msg.body();
    this.dao.getUserByAccount(body.getString("account"), r -> {
      if (r.succeeded()) {
        if (r.result() != null) {
          future.complete(r.result());
        } else {
          future.fail("账号不存在");
        }
      } else {
        future.fail("数据库错误:" + r.cause().getMessage());
      }
    });
  }
}


MyRequestHandler


public class MyRequestHandler{
  private Vertx vertx;


  private JsonObject config;
  
 public RobotRequestHandler(Vertx vertx, JsonObject config) {
    this.vertx = vertx;
    this.config = config;
  }
public void dispatchRequest(RoutingContext rc) {
    String userid = rc.request().getParam("userid");
    JsonObject body = rc.getBodyAsJson();
        JsonObject request = body.copy();
    this.dao.getUser("user", userid, r -> {
      if (r.succeeded() && r.result() != null) {
        JsonObject user = r.result();
        String username = user.getString("username");
    HttpServerRequest request=rc.request();
    HttpServerResponse response=rc.response();
        try {
         response.putHeader("Pragma", "no-cache");
         response.putHeader("Cache-Control", "no-cache");
         response.putHeader("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");
         response.putHeader("Content-Type", contenttype + ";charset=UTF-8");
         response.end(user.toString());
        } catch (Throwable e) {
          rc.response().end(e.toString());
        } finally {
          
        }
      } else {
        rc.response().end();
      }
    });
  }




更多知识请参考  https://github.com/vert-x3






github地址:https://github.com/vert-x3
1、获取进程PID
[java] view plain copy 在CODE上查看代码片派生到我的代码片
String name = ManagementFactory.getRuntimeMXBean().getName();  
    String pid = name.split("@")[0];  
可以将它保存在文件中,用于动态停止进程


2、获取配置文件
[java] view plain copy 在CODE上查看代码片派生到我的代码片
private void getConfig(Future<JsonObject> future) {  
   Vertx configVertx = Vertx.vertx();  
   configVertx.fileSystem().readFile(configDir + File.separator + "config.json",  
       res -> {  
         if (res.succeeded()) {  
           Buffer buf = res.result();  
           JsonObject config = buf.toJsonObject();  
           configVertx.close(re -> {  
             if (re.succeeded()) {  
               future.complete(config.getJsonObject("config"));  
             } else {  
               future.fail(re.cause());  
             }  
           });  
         } else {  
           future.fail(res.cause());  
         }  
    });  
 }  
[java] view plain copy 在CODE上查看代码片派生到我的代码片
  
3、创建vertx集群环境
[java] view plain copy 在CODE上查看代码片派生到我的代码片
private void createVertx(Future<Void> future) {  
      VertxOptions options = new VertxOptions();  
       options.setClustered(true);  
       ClusterManager mgr = new ZookeeperClusterManager();  
        options.setClusterHost("10.12.12.210");//本机zk地址  
         options.setClusterPort(clusterPort);  
         options.setClusterManager(mgr);  
      Vertx.clusteredVertx(options, res -> {  
        if (res.succeeded()) {  
          vertx = res.result();  
          future.complete();  
        } else {  
          future.fail(res.cause());  
        }  
      });  
      
  }  




4、注册一个编解码器到eventbus:主要用于实体传输时的编解码
[java] view plain copy 在CODE上查看代码片派生到我的代码片
vertx.eventBus().registerDefaultCodec(Result.class, new ResultCodec());  


5、部署verticle
[java] view plain copy 在CODE上查看代码片派生到我的代码片
private void deploy(String name, Handler<AsyncResult<String>> handler) {  
    if (config != null) {  
       DeploymentOptions deploymentOptions =  
          new DeploymentOptions().setConfig(config).setInstances(1).setWorker(true);  
      vertx.deployVerticle(name, deploymentOptions, result -> {  
        if (result.succeeded()) {  
          String deployId = result.result();  
          handler.handle(Future.succeededFuture(deployId));  
          System.out.println(name + " 部署成功 ");  
        } else {  
          handler.handle(Future.failedFuture(result.cause()));  
          System.out.println(name + " 部署失败  " + result.cause().getMessage());  
        }  
      });  
    } else {  
      handler.handle(Future.failedFuture("Config is null"));  
      log.error(name + " 部署失败 ");  
    }  
  }  


ManageVerticle
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class ManageVerticle extends AbstractVerticle {  
  protected Logger log = LoggerFactory.getLogger(this.getClass().getName());  
  
  private JsonObject config;  
  private ManageHandler manageHandler;  
  private Router mainRouter;  
    
  @Override  
  public void init(Vertx vertx, Context context) {  
    super.init(vertx, context);  
    this.config = context.config();  
     this.mainRouter = Router.router(vertx);  
  }  
  
  @Override  
  public void start(Future<Void> future) {  
    consumerListen();  
    addMyRoute();  
    future.complete();  
  }  
  
  @Override  
  public void stop(Future<Void> future) {  
    future.complete();  
  }  
  
  private void consumerListen() {  
    vertx.eventBus().consumer("user-create", manageHandler()::create);  
    vertx.eventBus().consumer("user-get", manageHandler()::get);  
    vertx.eventBus().consumer("user-update", manageHandler()::update);  
    vertx.eventBus().consumer("user-delete", manageHandler()::delete);  
  }  
  
  
  private void addMyRoute() {  
    HttpServerOptions options = new HttpServerOptions();  
    options.setPort(config().getInteger("http.port", 8081));  
    HttpServer server = vertx.createHttpServer(options);  
    server.requestHandler(configMainRouter()::accept);  
  
    server.listen(result -> {  
      if (result.succeeded()) {  
         
        future.complete();  
      } else {  
         
        future.fail(result.cause());  
      }  
    });  
  }  
private Router configMainRouter() {  
  
    mainRouter.route().failureHandler(ErrorHandler.create(true));  
    /* Session / cookies for users */  
    AuthProvider authProvider = MyAuthProvider.create(vertx, config);  
    mainRouter.route().handler(CookieHandler.create());  
    mainRouter.route().handler(  
        SessionHandler.create(LocalSessionStore.create(vertx)).setNagHttps(false));  
    mainRouter.route().handler(UserSessionHandler.create(authProvider));  
     //二级子路由  
    Router  subRouter = Router.router(vertx);  
     subRouter.route(HttpMethod.POST, "/getuser").handler(  
        new Dispatcher<Result>(MyRequestHandler()::getUser)::dispatchRequest);  
    mainRouter.mountSubRouter("/manage/",subRouter);  
  
    return mainRouter;  
  }  
  
  private ManageHandler manageHandler() {  
    if (manageHandler == null) {  
      manageHandler = new ManageHandler(vertx, config);  
    }  
    return manageHandler;  
  }  
  
}  


ManageHandler
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class ManageHandler {  
  protected Logger log = LoggerFactory.getLogger(this.getClass().getName());  
  private Vertx vertx;  
  private JsonObject config;  
  private ManageDao dao;  
  
  public ManageHandler(Vertx vertx, JsonObject config) {  
    this.vertx = vertx;  
    this.config = config;  
    this.dao = new ManageDao(vertx, config);  
  }  
  //consumer  
  public void getuser(Message<?> msg) {  
    Future<JsonObject> future = Future.future();  
    future.setHandler(r -> {  
      if (r.succeeded()) {  
        msg.reply(Result.succeedResult(r.result()));  
      } else {  
        msg.reply(Result.failResult("101", r.cause().getMessage()));  
      }  
    });  
    JsonObject body = (JsonObject) msg.body();  
    this.dao.getUserByAccount(body.getString("account"), r -> {  
      if (r.succeeded()) {  
        if (r.result() != null) {  
          future.complete(r.result());  
        } else {  
          future.fail("账号不存在");  
        }  
      } else {  
        future.fail("数据库错误:" + r.cause().getMessage());  
      }  
    });  
  }  
}  


MyRequestHandler


[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class MyRequestHandler{  
  private Vertx vertx;  
  
  private JsonObject config;  
    
 public RobotRequestHandler(Vertx vertx, JsonObject config) {  
    this.vertx = vertx;  
    this.config = config;  
  }  
public void dispatchRequest(RoutingContext rc) {  
    String userid = rc.request().getParam("userid");  
      JsonObject body = rc.getBodyAsJson();  
        JsonObject request = body.copy();  
    this.dao.getUser("user", userid, r -> {  
      if (r.succeeded() && r.result() != null) {  
        JsonObject user = r.result();  
        String username = user.getString("username");  
        HttpServerRequest request=rc.request();  
        HttpServerResponse response=rc.response();  
        try {  
         response.putHeader("Pragma", "no-cache");  
         response.putHeader("Cache-Control", "no-cache");  
         response.putHeader("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");  
         response.putHeader("Content-Type", contenttype + ";charset=UTF-8");  
         response.end(user.toString());  
        } catch (Throwable e) {  
          rc.response().end(e.toString());  
        } finally {  
            
        }  
      } else {  
        rc.response().end();  
      }  
    });  
    }  




更多知识请参考  https://github.com/vert-x3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vertx是一种基于事件驱动的应用程序框架,而MyBatis是一种流行的Java持久层框架。Vertx是轻量级的,可扩展的,适用于构建高性能的网络应用程序,而MyBatis则提供了一种优雅的方法来管理应用程序与数据库之间的交互。 Vertx与MyBatis的结合可以在构建Web应用程序时提供更好的开发体验和性能。Vertx通过异步IO和事件驱动的方式,可以快速地处理来自Web客户端的请求。而MyBatis可以通过提供有针对性的SQL语句,方便地对数据库进行操作。 Vertx提供了一个轻量级的Web服务器,可以处理HTTP请求和Websocket连接。而MyBatis可以方便地将数据库查询结果映射为Java对象。通过使用Vertx和MyBatis,我们可以将数据库查询和处理请求的逻辑解耦,使代码更易于理解和维护。 使用Vertx和MyBatis的组合,我们可以轻松地构建可扩展的,高性能的Web应用程序。我们可以使用Vertx的事件总线机制来处理不同组件之间的消息传递,同时利用MyBatis的缓存机制提高数据库查询的性能。 总的来说,Vertx和MyBatis是一对强大的组合,可以帮助我们构建高性能、可扩展的Web应用程序。通过将异步事件驱动的编程模型与优雅的数据库交互方式结合起来,我们可以更轻松地开发复杂的应用程序。 ### 回答2: Vert.x是一个基于JVM的高性能、非阻塞、事件驱动的应用框架,它可以用于构建轻量级、可伸缩、可扩展的分布式系统。而MyBatis是一个流行的Java持久化框架,它能够帮助我们方便地进行数据库访问。 Vert.x和MyBatis可以结合使用,以实现高效的数据库访问和处理。通常情况下,我们可以使用Vert.x的事件驱动机制来处理Web请求,而MyBatis则用于执行数据库操作。 首先,我们可以使用Vert.x的路由器来处理HTTP请求,并在请求处理程序中调用MyBatis执行数据库查询或更新操作。通过这种方式,我们可以确保数据库的访问是非阻塞的,避免了阻塞其他请求的情况发生。 其次,Vert.x的事件总线机制可以用于将不同模块之间的消息进行传递和处理。我们可以在MyBatis的映射器接口中定义观察者,当数据库发生变化时,MyBatis会向事件总线发布消息,其他模块可以根据需求来订阅这些消息进行相应的处理。 另外,Vert.x的异步特性与MyBatis的异步API结合使用,可以进一步提升应用程序的性能。我们可以使用Vert.x的异步回调机制来执行MyBatis的异步数据库操作,从而避免线程阻塞和资源浪费。 总而言之,Vert.x和MyBatis的结合使用可以为我们提供一个高性能、可伸缩的应用程序架构。通过将事件驱动的非阻塞处理与灵活的数据库访问相结合,我们可以构建出更好的分布式系统。 ### 回答3: Vertx是一个开源的、响应式的应用程序平台,可用于构建高性能、可伸缩的微服务和分布式系统。MyBatis是一个Java持久层框架,用于管理数据库访问,并且可以将数据库操作与应用程序逻辑分离。那么,Vertx和MyBatis可以结合使用吗? 答案是可以的。Vertx提供了异步的、非阻塞的I/O操作,而MyBatis则可以将I/O操作,例如数据库查询和更新,封装成简洁易用的API。Vertx和MyBatis的结合可以提供高效的数据库访问和管理,并且保持系统的响应性和可伸缩性。 在Vertx中使用MyBatis非常简单。首先,需要在Vertx应用程序的依赖中添加MyBatis的库。然后,可以通过MyBatis的配置文件来配置数据库连接和SQL映射。接下来,可以在Vertx的事件处理器中使用MyBatis的API来执行数据库操作。 在Vertx中使用MyBatis可以享受到Vertx的优势,例如事件驱动的架构和高性能的I/O操作。此外,Vertx还提供了丰富的异步编程模型和工具,可以方便地与MyBatis结合使用,例如使用Vertx的Future和Promise来处理异步的数据库操作结果。 总而言之,Vertx和MyBatis的结合可以提供高效的数据库访问和管理,并且保持系统的响应性和可伸缩性。这是一种强大的组合,可以用于构建高性能、可伸缩的微服务和分布式系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值