项目github地址:https://github.com/fotocj007/VertxWebApi

一:加入配置文件 mongodb.json

1 compile group: 'io.vertx', name: 'vertx-mongo-client', version: '3.9.8'
1 {
2 "sources": [
3 {"host": "10.0.205.199", "port": 27017, "db_name": "wsdemo","minPoolSize":5,"maxPoolSize": 10}
4 ],
5 "pools": 4
6 }

二:加载配置文件

 1 public class MongoDbConfig extends JsonObjectConfig {
2 public JsonArray sources;
3 public int poolSize;
4
5 public MongoDbConfig(Vertx vertx, String path){
6 super(vertx,path);
7 }
8
9 @Override
10 public void parse(JsonObject jsonObject) {
11 sources = jsonObject.getJsonArray("sources");
12 poolSize = jsonObject.getInteger("pools",8);
13 }
14 }

三:链接mongodb

 1 public class MongoPool {
2 private int poolSize;
3
4 private Vertx vertx;
5
6 private List<JsonObject> sourceList;
7
8 private Map<String,List<MongoClient>> pools;
9
10 public List<String> dbList;
11
12 public MongoPool(Vertx vertx, int poolS, List<JsonObject> sourceList){
13 this.vertx = vertx;
14 this.poolSize = poolS;
15 this.sourceList = sourceList;
16 pools = new HashMap<>(poolS);
17 dbList = new ArrayList<>(2);
18 initPool();
19 }
20
21 private void initPool() {
22 for (JsonObject config : sourceList) {
23 String db = config.getString("db_name");
24
25 String connectionString = String.format("mongodb://%s:%d/%s",
26 config.getString("host"), config.getInteger("port"),
27 db);
28
29 JsonObject options = new JsonObject()
30 .put("connection_string", connectionString)
31 .put("minPoolSize", config.getInteger("minPoolSize"))
32 .put("maxPoolSize",config.getInteger("maxPoolSize"));
33
34 // look for username, password and auth_source
35 Optional.ofNullable(config.getString("username", null))
36 .ifPresent(user -> options.put("username", user));
37 Optional.ofNullable(config.getString("password", null))
38 .ifPresent(pass -> options.put("password", pass));
39
40 List<MongoClient> list = new ArrayList<>();
41 for (int j = 1; j <= poolSize; j++) {
42 list.add(MongoClient.create(vertx, options));
43 }
44
45 dbList.add(db);
46 pools.put(db, list);
47 }
48 }
49
50 public MongoClient getClient(String db){
51 return pools.get(db).get(ThreadLocalRandom.current().nextInt(poolSize));
52 }
53
54 public void close(){
55 for(List<MongoClient> list : pools.values()){
56 for(MongoClient client : list){
57 client.close();
58 }
59 }
60 }
61 }

四:添加个帮助类

 1 public class PlayerMongo{
2 protected static Logger logger = LoggerFactory.getLogger(PlayerMongo.class);
3
4 private final String DB_NAME;
5
6 protected MongoPool mongoDbPool;
7
8 public PlayerMongo(MongoPool mongoPool) {
9 this.DB_NAME = mongoPool.dbList.get(0);
10 this.mongoDbPool = mongoPool;
11 }
12
13 public void findPlayerById(String collection,long playerId,Handler<AsyncResult<PlayerInfo>> handler) {
14 JsonObject jsonQuery = new JsonObject().put("_id",playerId);
15 mongoDbPool.getClient(DB_NAME).findOne(collection, jsonQuery, null, res -> {
16 if (res.succeeded()) {
17 JsonObject reData = res.result();
18
19 long id = reData.getLong("_id",playerId);
20 reData.remove("_id");
21
22 PlayerInfo info = new JsonObject(reData.toString()).mapTo(PlayerInfo.class);
23 info.setId(id);
24
25 handler.handle(Future.succeededFuture(info));
26 }else {
27 handler.handle(Future.failedFuture(res.cause()));
28 logger.error("findById error",res.cause());
29 }
30 });
31 }
32
33 public void updateAndInsert(String collection, long playerId, JsonObject upData, Handler<AsyncResult<Boolean>> handler){
34 JsonObject find = new JsonObject().put("_id",playerId);
35 JsonObject upInsert = new JsonObject()
36 .put("$set",upData);
37
38 //更新,没有时插入
39 mongoDbPool.getClient(DB_NAME).findOneAndUpdateWithOptions(collection, find, upInsert,
40 new FindOptions(),
41 new UpdateOptions().setUpsert(true), res -> {
42 if (res.succeeded()) {
43 handler.handle(Future.succeededFuture(true));
44 } else {
45 handler.handle(Future.failedFuture(res.cause()));
46 logger.error("updateAndInsert error",res.cause());
47 }
48 });
49 }
50 }

五:Dao管理类

 1 public class MongoManager {
2 private MongoPool mongoPool;
3
4 private PlayerMongo playerMongo;
5
6 public MongoManager(MongoPool mySQLPool){
7 this.mongoPool = mySQLPool;
8 init();
9 }
10
11 private void init(){
12 playerMongo = new PlayerMongo(mongoPool);
13 }
14
15 public PlayerMongo getPlayerMongo(){
16 return playerMongo;
17 }
18 }

六:修改configure,初始化mongodb.

 1 public class Configure {
2 private static final Configure ourInstance = new Configure();
3
4 public Configure() {
5 }
6
7 public static Configure getInstance() {
8 return ourInstance;
9 }
10
11 protected Vertx vertx;
12
13 public MysqlConfig mysqlConfig;
14 private MySQLUtil mySQLPool;
15 public DaoManager daoManager;
16
17 private RedisConfig redisConfig;
18 private RedisPool redisPool;
19 public RedisUtil redisUtil;
20
21 private MongoDbConfig mongoDbConfig;
22 private MongoPool mongoPool;
23 public MongoManager mongoManager;
24
25 public void init(Vertx vertx){
26 this.vertx = vertx;
27
28 initHandler();
29
30 loadConfig();
31
32 initDb();
33 initRedis();
34 initMongoDb();
35 }
36
37 private void initHandler(){
38 HandlerManager.getInstance().addHandler(new DemoHandler());
39 }
40
41 /**
42 * 加载db和Redis配置文件
43 */
44 protected void loadConfig(){
45 mysqlConfig = new MysqlConfig(vertx, "res/mysql.json");
46 redisConfig = new RedisConfig(vertx, "res/redis.json");
47 mongoDbConfig = new MongoDbConfig(vertx,"res/mongodb.json");
48 }
49
50 protected void initDb(){
51 List<JsonObject> list = new ArrayList<>();
52 for(int i = 0; i< mysqlConfig.configs.size();i++){
53 list.add(mysqlConfig.configs.getJsonObject(i));
54 }
55 mySQLPool = new MySQLUtil(vertx,2,list);
56
57 daoManager = new DaoManager(mysqlConfig,mySQLPool);
58 }
59
60 /**
61 * 初始化Redis
62 */
63 protected void initRedis(){
64 redisPool = new RedisPool(vertx,redisConfig);
65 redisUtil = new RedisUtil(redisPool);
66 }
67
68 private void initMongoDb(){
69 List<JsonObject> list = new ArrayList<>();
70 for(int i = 0; i< mongoDbConfig.sources.size();i++){
71 list.add(mongoDbConfig.sources.getJsonObject(i));
72 }
73 mongoPool = new MongoPool(vertx,mongoDbConfig.poolSize,list);
74 mongoManager = new MongoManager(mongoPool);
75 }
76
77 public void closeResource(){
78 if(mySQLPool != null){
79 mySQLPool.close();
80 }
81 if(redisPool != null){
82 redisPool.close();
83 }
84
85 if(mongoPool != null){
86 mongoPool.close();
87 }
88 }
89 }

七:测试一下,修改DemoHandler

        PlayerInfo info = new PlayerInfo();
info.setId(3242353465L);
info.setUserName("kkkkkdd");
info.setAge(100); PlayerMongo playerMongo = Configure.getInstance().mongoManager.getPlayerMongo();
playerMongo.updateAndInsert("playerColl",info.getId(),new JsonObject(JsonObject.mapFrom(info).toString()),res -> {
System.out.println(res.result()); //查询
playerMongo.findPlayerById("playerColl",info.getId(),ress -> {
System.out.println(ress); });
});

发起请求,查看输出:

项目结构:

Vertx 接入MongoDB (九)的更多相关文章

  1. MongoDB (九) MongoDB 投影

    mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段. find() 方法 MongoDB 的find()方法, ...

  2. [转载]MongoDB开发学习 经典入门

    如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四 ...

  3. MongoDB开发学习

    如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四 ...

  4. [转载]MongoDB开发学习(1)开天辟地,经典入门

    原文地址:http://www.cnblogs.com/xumingxiang/archive/2012/04/08/2437468.html 如果你从来没有接触MongoDB或对MongoDB有一点 ...

  5. MongoDB开发学习(1)开天辟地,经典入门

    原文地址:http://www.cnblogs.com/xumingxiang/archive/2012/04/08/2437468.html 如果你从来没有接触MongoDB或对MongoDB有一点 ...

  6. MongoDB入门学习笔记之简介与安装配置

    一.MongoDB简介 1.文档数据库 MongoDB是一款开源的文档型非关系数据库,具有高性能.高可靠性和自动扩展等特点.MongoDB中的每一条记录是一个文档,其数据存储结构为键/值对,类似JSO ...

  7. 5-3 掌握 egg.js + 云 mongodb

    1 egg.js 1.1 初始化 初始化和项目启动方法 # 初始化 $ mkdir egg-example && cd egg-example $ npm init egg --typ ...

  8. Nodejs电影建站开发实例(上)

    网站环境:使用express框架.bootstrap样式.jade模板.mongoose数据库 npm insatll express -g npm insatll jada -g npm insat ...

  9. c++利用jsoncpp libcurl 构造http 包(原)

    我们手游要接入uc九游进行测试,要用http向uc那边的sdk 服务器post  json数据. 虽然他们提供了php,java还有c#的服务端demo,但是我们服务器是C++写的,我实在不想中间再转 ...

  10. 《.NETer提高效率——环境部署》

    初衷 兵马未动,粮草先行. 电脑坏了or换工作等需要重装系统. 开发运维一把梭. 与时俱进. 记忆力差,需要文字记录. 因为懒... 目的 通过学习 Linux+docker+kubernetes+C ...

随机推荐

  1. DFS 2025/1/15

    DFS & DFS 剪枝优化 Basic 01 先搜节点少的分支 如果搜进来一个大分支而答案不在此分支就会浪费大量时间 02 可行性剪枝 已经白扯了就 return 判断当前是否合法 03 最 ...

  2. langchain0.3教程:从0到1打造一个智能聊天机器人

    在上一篇文章<大模型开发之langchain0.3(一):入门篇> 中已经介绍了langchain开发框架的搭建,最后使用langchain实现了HelloWorld的代码案例,本篇文章将 ...

  3. Static Timing Analysis Basics

    Preface This note only introduce the essential concepts about Static Timing Analysis, which not cont ...

  4. 2025成都.NET开发者Connect圆满结束

    大家好,我是Edison. 2025年成都.NET开发者Connect线下聚会活动于3月29日圆满结束,本次活动吸引了约30位.NET开发者朋友参与,他们分别来自成都各家技术公司,我们相聚城南华府国际 ...

  5. AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析

    AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析 阅读时间: 5分钟 | 字数: 1500+ "你是否曾为单个大模型难以解决复杂专业问题而苦恼?是否想过,如果能像组建专业团队 ...

  6. 手写数字识别实战教程:从零实现MNIST分类器(完整代码示例)

    引言:数字识别的魔法世界 在人工智能的奇妙宇宙中,手写数字识别堪称经典中的经典.这个看似简单的任务--让电脑像人一样"认数字",背后蕴含着模式识别的核心思想.本文将带领你亲手实现一 ...

  7. Lua虚拟机

    Lua虚拟机概述 何为"虚拟机"? 在一门脚本语言中,总会有一个虚拟机,可是"虚拟机"是什么?简而言之,这里的"虚拟机"就是使用代码实现的用 ...

  8. C#+Appium+Nunit实现app自动化demo

    1.新建Nunit工程 打开Rider新建一个Nunit工程并使用NuGet安装对应库,步骤如下: 2.编写代码 代码如下: using System; using NUnit.Framework; ...

  9. 你了解 Java 的类加载器吗?

    Java 类加载器(ClassLoader) Java 中的类加载器是用于加载 .class 文件到 JVM 中的组件,它的核心作用是将字节码(.class 文件)加载到内存,并且使它能够被 JVM ...

  10. QUBO建模

    技术背景 QUBO(Quadratic Unconstrained Binary Optimization)模型是一种常用于求解组合优化问题的一种技术,它所能够求解的问题是这样定义的:给定一个布尔类型 ...