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
Vertx3入门应用相关推荐
- Vertx入门学习(含代码)
Vertx入门学习 一.Vertx是什么? 二.Vertx基本概念 三.Vertx能干什么? 四.Vertx的技术体系 五.快速体验:搭建一个简单的Vertx项目并输出Hello World 六.单元 ...
- 用Construct 2制作入门小游戏~
今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...
- Docker入门六部曲——Swarm
原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...
- Docker入门六部曲——Stack
原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...
- Docker入门六部曲——服务
原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...
- 【springboot】入门
简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...
- SpringBoot (一) :入门篇 Hello World
什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...
- 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题
入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...
- 5 分钟入门 Google 最强NLP模型:BERT
BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...
最新文章
- R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射
- 清华大学高鸣宇:基于Halide调度实现高效能的DNN加速
- 疯狂ios之疯狂打飞机游戏(3)
- C语言 while 循环 - C语言零基础入门教程
- 画面设置_LOL手游设置界面翻译:基本设置/画面/音效/功能与快捷语音
- Linux驱动之设备模型(1)
- html文本文档整人代码,一些bat恶搞代码
- Spring Cloud Alibaba RocketMQ 快速入门
- BabeLua--Lua调试器
- 离散数学(第二版) 第一章、第二章习题
- 中国足球深度剖析之五,破除周期性怪圈
- 屏库是个很好的网站,囊括了几乎所有型号的显示屏
- 什么是mac os?它有哪些好的特点?有哪些应用小技巧
- ios 自定义拍照页面_iOS开发笔记:自定义相机拍照
- 如何面对工作中的困难和纠结
- win10下点击开始菜单没响应的解决方案
- 24 Three.js的环境光源THREE.AmbientLight
- 关于批量插入一组数据
- Android中获取手机内所有应用信息
- 浅析招聘求职新渠道和传统网络招聘