当前位置: 首页 > news >正文

品牌网站 响应式网站福州网站建设 网络服务

品牌网站 响应式网站,福州网站建设 网络服务,南昌seo营销,网站代文章目录 一.编写思路二.代码实践 一.编写思路 定义消息队列 名字是否持久化 定义队列持久化类(持久化到 sqlite3) 构造函数(只能成功#xff0c;不能失败) 如果数据库(文件)不存在则创建打开数据库打开 msg_queue_table 数据库表 插入队列移除队列将数据库中的队列恢复到内存… 文章目录 一.编写思路二.代码实践 一.编写思路 定义消息队列 名字是否持久化 定义队列持久化类(持久化到 sqlite3) 构造函数(只能成功不能失败) 如果数据库(文件)不存在则创建打开数据库打开 msg_queue_table 数据库表 插入队列移除队列将数据库中的队列恢复到内存中 传入一个哈希表key 为名字value 为队列的智能指针填充该哈希表 定义队列管理类(包含内存管理和持久化管理) 构造函数从数据库中恢复队列声明队列移除队列获取队列 二.代码实践 MsgQueue.hpp: #pragma once #include ../common/Log.hpp #include ../common/Util.hpp #include ../common/Util.hpp #include memory #include unordered_map #include mutex namespace ns_data {class MsgQueue;using MsgQueuePtr std::shared_ptrMsgQueue;/************* 定义消息队列* ****************/struct MsgQueue{std::string _name;bool _isDurable;MsgQueue(const std::string name, bool isDurable): _name(name),_isDurable(isDurable){}};/****************** 定义消息队列持久化类* ******************/class MsgQueueMapper{private:ns_util::Sqlite3Util _sqlite;public:MsgQueueMapper(const std::string dbName): _sqlite(dbName){// 确保数据库文件已经存在不存在就创建if (!ns_util::FileUtil::createFile(dbName)){LOG(FATAL) create database dbName fail endl;exit(1);}if (!_sqlite.open()){LOG(FATAL) open database dbName fail endl;exit(1);}createTable();}/************** 插入消息队列* *************/bool insertMsgQueue(MsgQueuePtr msgQueuePtr){char insertSql[1024];sprintf(insertSql, insert into msg_queue_table values(%s, %d);,msgQueuePtr-_name.c_str(), msgQueuePtr-_isDurable);if (!_sqlite.exec(insertSql, nullptr, nullptr)){LOG(WARNING) insert MsgQueue fail, MsgQueue: msgQueuePtr-_name endl;return false;}return true;}/*********** 移除消息队列* ***************/void removeMsgQueue(const std::string name){char deleteSql[1024];sprintf(deleteSql, delete from msg_queue_table where name%s;, name.c_str());if (!_sqlite.exec(deleteSql, nullptr, nullptr)){LOG(WARNING) remove MsgQueue fail, MsgQueue: name endl;}}/************ 从数据库中恢复消息队列到内存* *****************/void recoverMsgQueue(std::unordered_mapstd::string, MsgQueuePtr *mapPtr){const std::string selectSql select * from msg_queue_table;;if (!_sqlite.exec(selectSql.c_str(), selectCallback, mapPtr)){LOG(FATAL) recover MsgQueue from msg_queue_table fail endl;exit(1);}}/*************** 删除数据库表(仅调试)* ***************/void removeTable(){const std::string dropSql drop table if exists msg_queue_table;;if (_sqlite.exec(dropSql.c_str(), nullptr, nullptr)){LOG(WARNING) remove table msg_queue_table fail endl;}}private:void createTable(){const std::string createSql create table if not exists msg_queue_table(\name varchar(32) primary key,\durable int\);;if (!_sqlite.exec(createSql.c_str(), nullptr, nullptr)){LOG(FATAL) create table msg_queue_table fail endl;exit(1);}}static int selectCallback(void *arg, int colNum, char **line, char **fields){auto mapPtr static_caststd::unordered_mapstd::string, MsgQueuePtr *(arg);std::string name line[0];bool isDurable std::stoi(line[1]);auto msgQueuePtr std::make_sharedMsgQueue(name, isDurable);mapPtr-insert({name, msgQueuePtr});return 0;}};class MsgQueueManager{private:MsgQueueMapper _mapper;std::unordered_mapstd::string, MsgQueuePtr _msgQueues;std::mutex _mtx;public:MsgQueueManager(const std::string dbName): _mapper(dbName){_mapper.recoverMsgQueue(_msgQueues);}/************ 声明队列* ************/bool declareMsgQueue(const std::string name, bool isDurable){std::unique_lockstd::mutex lck(_mtx);if (_msgQueues.count(name)){return true;}auto msgQueuePtr std::make_sharedMsgQueue(name, isDurable);_msgQueues[name] msgQueuePtr;if (isDurable){return _mapper.insertMsgQueue(msgQueuePtr);}return true;}/*********** 移除队列* ***********/void removeMsgQueue(const std::string name){std::unique_lockstd::mutex lck(_mtx);auto it _msgQueues.find(name);if (it _msgQueues.end()){return;}if (it-second-_isDurable){_mapper.removeMsgQueue(name);}_msgQueues.erase(name);}/************* 获取指定队列* ***************/MsgQueuePtr getMsgQueue(const std::string name){std::unique_lockstd::mutex lck(_mtx);if (_msgQueues.count(name) 0){return nullptr;}return _msgQueues[name];}/************** 清理所有队列(仅调试)* ******************/void clearMsgQueues(){std::unique_lockstd::mutex lck(_mtx);_msgQueues.clear();_mapper.removeTable();}};}
http://www.hkea.cn/news/14448156/

相关文章:

  • wordpress 关闭feed昆明网站优化推广平台
  • 山西建设厅官方网站公示购物网站首页分成几个模块
  • 潍坊方圆网站建设360上网安全导航
  • 国内个人网站搭建烟台展厅设计公司
  • 网站建设与网站制作在线制作wap网站
  • 大连金州代做网站公众号网页设计实验报告模板
  • 商城网站的基本功能中国移动网站官网
  • 浙江网站建设哪家好wordpress公众号文章分类
  • 重庆云阳网站建设公司免费的外贸网站推广方法
  • 北京网站建设 专业10年seo与sem的区别和联系
  • 足球网站开发阿坝北京网站建设
  • 做微信商城网站建设php语言 网站建设
  • 网站顶部展出的大幅广告新冠三阳意味着什么
  • 做网站遇到的困难总结百度seo是什么意思呢
  • 设计发明的网站网站的运营维护
  • 做网站可以赚钱嘛株洲网站建设制作
  • 网站开发设计公网站建设的税收编码
  • 担路网络科技有限公司的证书南宁百度seo建议
  • 注册网站英语网络营销是什么系
  • 天津市设计网站的公司秦皇岛在建工程项目
  • 做英文网站哪里好曲阳有没有做网站里
  • 网站换主题网站建设最快多长时间
  • 云存储能用来做网站吗网站问卷调查怎么做
  • 摄影设计专业seo刷网站
  • 哪些网站可以做详情页公司网站格式
  • 怎么配置网站服务器分销商系统
  • 沈阳网站建设企业职业技能培训机构
  • 做网站用什么开发好假网站连接怎么做的
  • 泰安企业网站建设网址在线生成短链接
  • 在电脑上建设个人网站厦门市网站建设软件开发公司