zoukankan      html  css  js  c++  java
  • Vertx 接入MongoDB (九)

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

    一:加入配置文件 mongodb.json

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

    二:加载配置文件

     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 }
    View Code

    三:链接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 }
    View Code

    四:添加个帮助类

     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 }
    View Code

    五: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 }
    View Code

    六:修改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 }
    View Code

    七:测试一下,修改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);
    
                });
            });

    发起请求,查看输出:

     

    项目结构:

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/cj8988/p/15040216.html
Copyright © 2011-2022 走看看