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

白酒营销网站厦门网站制作开发收费

白酒营销网站,厦门网站制作开发收费,网页浏览加速器,百度seo公司整站优化目录 一、内存数据管理 1.1、需求分析 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 1.2.2、封装交换机操作 1.2.3、封装队列操作 1.2.4、封装绑定操作 1.2.5、封装消息操作 1.2.6、封装未确认消息操作 1.2.7、封装恢复数据操作 一、内存数据管理…目录 一、内存数据管理 1.1、需求分析 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 1.2.2、封装交换机操作 1.2.3、封装队列操作 1.2.4、封装绑定操作 1.2.5、封装消息操作 1.2.6、封装未确认消息操作 1.2.7、封装恢复数据操作 一、内存数据管理 1.1、需求分析 当前已经使用 数据库 管理了 交换机、绑定、队列又使用 数据文件 管理了 消息. 最后还使用一个类将上述两部分整合在了一起对上层提供统一的一套接口. 但对于 MQ 来说是以内存存储数据为主硬盘存储数据为辅硬盘数据主要是为了持久化保存重启之后数据不丢失. 接下来就需要使用 内存 来管理上述数据~~ 这里我们主要使用 ConcurrentHashMap 来进行数据管理主要是因为线程安全问题. 交换机使用 ConcurrentHashMapkey 是 namevalue 是 Exchange 对象。 队列使用 ConcurrentHashMapkey 是 namevalue 是 MSGQueue 对象。 绑定使用嵌套的 ConcurrentHashMapkey 是 exchangeNamevalue 是一个 ConcurrentHashMapkey 是 queueNamevalue 是 Binding 对象。 消息使用 ConcurrentHashMapkey 是 messageId value 是 Message 对象。 队列和消息的关联关系使用嵌套的 ConcurrentHashMapkey 是 queueNamevalue 是一个 LinkedList每个元素是一个 Message 对象。 表示 “未被确认” 的消息使用嵌套的 ConcurrentHashMapkey 是 queueNamevalue 是 ConcurrentHashMapkey 是 messageIdvalue 是 Message 对象后续实现消息确认的逻辑需要根据 ack 响应的内容会提供一个确认的 messageId根据这个 messageId 来把上述结构中的 Message 对象找到并移除。 Ps此处实现的 MQ支持两种应答模式的 ACK 自动应答消费者取了元素整个消息就算是被应答了此时整个消息就可以被干掉了。手动应答消费者取了元素这个消息不算被应答需要消费者主动再调用一个 basicAck 方法此时才认为是真正应答了才能删除这个消息。 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 这里就是用 ConcurrentHashMap 来对上述数据进行统一内存管理. //key 是 exchangeName, value 是 Exchange 对象private ConcurrentHashMapString, Exchange exchangeMap new ConcurrentHashMap();//key 是 queueName, value 是 MSGQueue 对象private ConcurrentHashMapString, MSGQueue queueMap new ConcurrentHashMap();//第一个 key 是 exchangeName第二个 key 是 queueNameprivate ConcurrentHashMapString, ConcurrentHashMapString, Binding bindingsMap new ConcurrentHashMap();//key 是 messageId value 是 Message 对象private ConcurrentHashMapString, Message messageMap new ConcurrentHashMap();//key 是 queueName value 是 Message 的链表private ConcurrentHashMapString, LinkedListMessage queueMessageMap new ConcurrentHashMap();// 第一个 key 是 queueName 第二个 key 是 messageIdprivate ConcurrentHashMapString, ConcurrentHashMapString, Message queueMessageWaitAckMap new ConcurrentHashMap();1.2.2、封装交换机操作 主要就是对 exchangeMap 插入、获取、删除交换机. public void insertExchange(Exchange exchange) {exchangeMap.put(exchange.getName(), exchange);System.out.println([MemoryDataCenter] 新交换机添加成功! exchangeName exchange.getName());}public Exchange getExchange(String exchangeName) {return exchangeMap.get(exchangeName);}public void deleteExchange(String exchangeName) {exchangeMap.remove(exchangeName);System.out.println([MemoryDataCenter] 交换机删除成功! exchangeName exchangeName);}1.2.3、封装队列操作 主要就是对 queueMap 插入、获取、删除队列. public void insertQueue(MSGQueue queue) {queueMap.put(queue.getName(), queue);System.out.println([MemoryDataCenter] 新队列添加成功! queueName queue.getName());}public MSGQueue getQueue(String queueName) {return queueMap.get(queueName);}public void deleteQueue(String queueName) {queueMap.remove(queueName);System.out.println([MemoryDataCenter] 队列删除成功! queueName queueName);}1.2.4、封装绑定操作 这里值得注意的是加锁逻辑并不是加了锁就一定安全也不是说不加锁就一定不安全如果这段代码前后逻辑性很强需要打包成一个原子性的操作那就可以进行加锁如果不是那么强的因果就没必要因为加锁也是需要开销的加锁之后的锁竞争更是一个时间消耗。 public void insertBinding(Binding binding) throws MqException { // ConcurrentHashMapString, Binding bindingMap bindingsMap.get(binding.getExchangeName()); // if(bindingMap null) { // bindingMap new ConcurrentHashMap(); // bindingsMap.put(binding.getExchangeName(), bindingMap); // }//上面这段逻辑可以用以下代码来替换ConcurrentHashMapString, Binding bindingMap bindingsMap.computeIfAbsent(binding.getExchangeName(),k - new ConcurrentHashMap());synchronized(bindingMap) {//再根据 queueName 查一下只有不存在的时候才能插入存在就抛出异常if(bindingMap.get(binding.getQueueName()) ! null) {throw new MqException([MemoryDataCenter] 绑定已经存在! exchangeName binding.getExchangeName() , queueName binding.getQueueName());}bindingMap.put(binding.getQueueName(), binding);}System.out.println([MemoryDataCenter] 新绑定添加成功exchangeName binding.getExchangeName() , queueName binding.getQueueName());}/*** 获取绑定有两个版本* 1.根据 exchangeName 和 queueName 确定唯一一个 Binding* 2.根据 exchangeName 获取到所有的 Binding* param exchangeName* param queueName* return*/public Binding getBinding(String exchangeName, String queueName) throws MqException {ConcurrentHashMapString, Binding bindingMap bindingsMap.get(exchangeName);if(bindingMap null) {throw new MqException([MemoryDataCenter] 绑定不存在exchangeName exchangeName , queueName queueName);}return bindingMap.get(queueName);}public ConcurrentHashMapString, Binding getBindings(String exchangName) {return bindingsMap.get(exchangName);}public void deleteBinding(Binding binding) throws MqException {ConcurrentHashMapString, Binding bindingMap bindingsMap.get(binding.getExchangeName());//这里操作不是很关键因此可以不用加锁(加锁不一定就安全也不是说不加锁就一定不安全要结合实际场景)//如果这段代码前后逻辑性很强需要打包成一个原子性的操作那就可以进行加锁如果不是那么强的因果就没必要因为加锁也是需要开销的加锁之后的锁竞争更是一个时间消耗if(bindingMap null) {throw new MqException([MemoryDataCenter] 绑定不存在exchangeName binding.getExchangeName() , queueName binding.getQueueName());}bindingMap.remove(binding.getQueueName());System.out.println([MemoryDataCenter] 绑定删除成功exchangeName binding.getExchangeName() , queueName binding.getQueueName());}1.2.5、封装消息操作 这里值得注意的是 LinkedList 是线程不安全的要特殊处理. /*** 添加消息* param message*/public void addMessage(Message message) {messageMap.put(message.getMessageId(), message);System.out.println([MemoryDataCenter] 新消息添加成功messageId message.getMessageId());}/*** 根据 id 查询消息* param messageId*/public Message selectMessage(String messageId) {return messageMap.get(messageId);}/*** 根据 id 删除消息* param messageId*/public void removeMessage(String messageId) {messageMap.remove(messageId);System.out.println([MemoryDataCenter] 消息被移除messageId messageId);}/*** 发送消息到指定队列* param message*/public void sendMessage(MSGQueue queue, Message message) {//先根据队列名字找到指定的链表LinkedListMessage messages queueMessageMap.computeIfAbsent(queue.getName(), k - new LinkedList());//LinkedList 是线程不安全的synchronized (messages) {messages.add(message);}//这里把消息在消息中心也插入一下。即使 message 在消息中心存在也没关系//因为相同的 messageId 对应的 message 的内容一定是一样的(服务器不会修改 Message 的内容)addMessage(message);System.out.println([MemoryDataCenter] 消息被投递到队列当中messageId message.getMessageId());}/*** 从队列中取消息* param queueName* return*/public Message pollMessage(String queueName) {LinkedListMessage messages queueMessageMap.get(queueName);if(messages null) {return null;}synchronized (messages) {if(messages.size() 0) {return null;}//链表中有消息就进行头删Message currentMessage messages.remove(0);System.out.println([MemoryDataCenter] 消息从队列中取出! messageId currentMessage.getMessageId());return currentMessage;}}/*** 获取指定队列的消息个数* param queueName* return*/public int getMessageCount(String queueName) {LinkedListMessage messages queueMessageMap.get(queueName);if(messages null) {return 0;}synchronized (messages) {return messages.size();}}1.2.6、封装未确认消息操作 “未被确认” 的消息使用嵌套的 ConcurrentHashMapkey 是 queueNamevalue 是 ConcurrentHashMapkey 是 messageIdvalue 是 Message 对象后续实现消息确认的逻辑需要根据 ack 响应的内容会提供一个确认的 messageId根据这个 messageId 来把上述结构中的 Message 对象找到并移除。 /*** 添加未确认的消息* param queueName* param message*/public void addMessageWaitAck(String queueName, Message message) {ConcurrentHashMapString, Message messageHashMap queueMessageWaitAckMap.computeIfAbsent(queueName,k - new ConcurrentHashMap());messageHashMap.put(message.getMessageId(), message);System.out.println([MemoryDataCenter] 消息进入待确认队列messageId message.getMessageId());}/*** 删除未确认的消息* param messageId*/public void removeMessageWaitAck(String queueName, String messageId) {ConcurrentHashMapString, Message messageHashMap queueMessageWaitAckMap.get(queueName);if(messageHashMap null) {return;}messageHashMap.remove(messageId);System.out.println([MemoryDataCenter] 消息从待确认队列中删除messageId messageId);}public Message getMessageWaitAck(String queueName, String messageId) {ConcurrentHashMapString, Message messageHashMap queueMessageWaitAckMap.get(queueName);if(messageHashMap null) {return null;}return messageHashMap.get(messageId);}1.2.7、封装恢复数据操作 从硬盘上读取数据把硬盘中之前持久化存储的各个维度的数据都恢复到内存中. public void recovery(DiskDataCenter diskDataCenter) throws IOException, MqException, ClassNotFoundException {//1.先清空之前所有的数据exchangeMap.clear();queueMap.clear();bindingsMap.clear();messageMap.clear();queueMessageMap.clear();//2.恢复所有的交换机数据ListExchange exchanges diskDataCenter.selectAllExchanges();for(Exchange exchange : exchanges) {exchangeMap.put(exchange.getName(), exchange);}//3.恢复所有的队列数据ListMSGQueue queues diskDataCenter.selectAllQueue();for(MSGQueue queue : queues) {queueMap.put(queue.getName(), queue);}//4.恢复所有绑定数据ListBinding bindings diskDataCenter.selectAllBindings();for(Binding binding : bindings) {ConcurrentHashMapString, Binding bindingMap bindingsMap.computeIfAbsent(binding.getExchangeName(),k - new ConcurrentHashMap());bindingMap.put(binding.getQueueName(), binding);}//5.恢复所有的消息数据for(MSGQueue queue : queues) {LinkedListMessage messages diskDataCenter.loadAllMessagesFromQueue(queue.getName());queueMessageMap.put(queue.getName(), messages);//遍历所有的队列根据每个队列名字。来恢复所有消息for(Message message : messages) {messageMap.put(message.getMessageId(), message);}}}Ps“未确认的消息” 这部分数据不需要从硬盘中恢复之前硬盘存储也没有考虑过这里~ 一旦在等待 ack 的过程中服务器重启了这些 “未被确认的消息” 就恢复成了 “未被取走的消息”这个消息在硬盘上存储的时候就是当作 “未被取走”。
文章转载自:
http://www.morning.xswrb.cn.gov.cn.xswrb.cn
http://www.morning.msbct.cn.gov.cn.msbct.cn
http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn
http://www.morning.bqyb.cn.gov.cn.bqyb.cn
http://www.morning.btgxf.cn.gov.cn.btgxf.cn
http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn
http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com
http://www.morning.fywqr.cn.gov.cn.fywqr.cn
http://www.morning.xjmyq.com.gov.cn.xjmyq.com
http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn
http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn
http://www.morning.hqykb.cn.gov.cn.hqykb.cn
http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn
http://www.morning.txysr.cn.gov.cn.txysr.cn
http://www.morning.bhdtx.cn.gov.cn.bhdtx.cn
http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn
http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn
http://www.morning.ryspp.cn.gov.cn.ryspp.cn
http://www.morning.gpsr.cn.gov.cn.gpsr.cn
http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn
http://www.morning.zlrrj.cn.gov.cn.zlrrj.cn
http://www.morning.fwcjy.cn.gov.cn.fwcjy.cn
http://www.morning.mmjqk.cn.gov.cn.mmjqk.cn
http://www.morning.xcszl.cn.gov.cn.xcszl.cn
http://www.morning.zdhxm.com.gov.cn.zdhxm.com
http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn
http://www.morning.dndjx.cn.gov.cn.dndjx.cn
http://www.morning.gxklx.cn.gov.cn.gxklx.cn
http://www.morning.pumali.com.gov.cn.pumali.com
http://www.morning.gdljq.cn.gov.cn.gdljq.cn
http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn
http://www.morning.ghslr.cn.gov.cn.ghslr.cn
http://www.morning.mxdhy.cn.gov.cn.mxdhy.cn
http://www.morning.nkddq.cn.gov.cn.nkddq.cn
http://www.morning.gybnk.cn.gov.cn.gybnk.cn
http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn
http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn
http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn
http://www.morning.zwyuan.com.gov.cn.zwyuan.com
http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn
http://www.morning.ndpwg.cn.gov.cn.ndpwg.cn
http://www.morning.qnxzx.cn.gov.cn.qnxzx.cn
http://www.morning.jbtzx.cn.gov.cn.jbtzx.cn
http://www.morning.qkbwd.cn.gov.cn.qkbwd.cn
http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn
http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn
http://www.morning.rbjp.cn.gov.cn.rbjp.cn
http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn
http://www.morning.gllgf.cn.gov.cn.gllgf.cn
http://www.morning.qkpzq.cn.gov.cn.qkpzq.cn
http://www.morning.bfgbz.cn.gov.cn.bfgbz.cn
http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn
http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn
http://www.morning.lrprj.cn.gov.cn.lrprj.cn
http://www.morning.lmbm.cn.gov.cn.lmbm.cn
http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn
http://www.morning.wdskl.cn.gov.cn.wdskl.cn
http://www.morning.zcwzl.cn.gov.cn.zcwzl.cn
http://www.morning.yjprj.cn.gov.cn.yjprj.cn
http://www.morning.mqss.cn.gov.cn.mqss.cn
http://www.morning.nnrqg.cn.gov.cn.nnrqg.cn
http://www.morning.zwpzy.cn.gov.cn.zwpzy.cn
http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn
http://www.morning.qpqwd.cn.gov.cn.qpqwd.cn
http://www.morning.rxfjg.cn.gov.cn.rxfjg.cn
http://www.morning.dtrz.cn.gov.cn.dtrz.cn
http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn
http://www.morning.gxfpk.cn.gov.cn.gxfpk.cn
http://www.morning.mbrbg.cn.gov.cn.mbrbg.cn
http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn
http://www.morning.nwfxp.cn.gov.cn.nwfxp.cn
http://www.morning.zcckq.cn.gov.cn.zcckq.cn
http://www.morning.jhrtq.cn.gov.cn.jhrtq.cn
http://www.morning.zrks.cn.gov.cn.zrks.cn
http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn
http://www.morning.wpwyx.cn.gov.cn.wpwyx.cn
http://www.morning.cpmwg.cn.gov.cn.cpmwg.cn
http://www.morning.xlyt.cn.gov.cn.xlyt.cn
http://www.morning.muzishu.com.gov.cn.muzishu.com
http://www.morning.prznc.cn.gov.cn.prznc.cn
http://www.tj-hxxt.cn/news/278300.html

相关文章:

  • 生物公司网站建设大良网站设计价格
  • 网站设计的流程简答题云南省建筑信息平台
  • 企业信用公示网上查询平台seo整站优化公司持续监控
  • 用pc做网站服务器为什么不如云主机鹤壁市网站建设
  • 做网站常见问题模板纳米加工平台
  • 为什么网站建设需要每年续费软件跟网站开发的区别
  • 苏州建设网站制作wordpress发不了博文
  • django 网站开发教程企业邮箱号是什么样的格式
  • 免费网站设计素材西安的电商网站设计
  • 北京活动策划网站新媒体营销策略有哪些
  • 海拉尔做网站多少钱天天新品网做网站
  • 优礼品网站模板郑州网站建设douyanet
  • 网站建设 标书wordpress 建站五分钟
  • 买服饰网站建设网件r6300v2
  • vue做网站对seowordpress 卡
  • 太原网站建设公司招聘不定期更新域名
  • 电子商务 网站设计建筑工程网格化管理
  • 物流网站开发项目书制作app多少钱一个
  • 校园门户网站建设公司wordpress 广告代码
  • dz后台网站地图南宁哪里有做开通网站的
  • 做ssp用什么建网站宁夏银川做网站的公司有哪些
  • 东风地区网站建设价格手机网站制作套餐
  • 网站建设策划基本流程图wordpress+有广告
  • 能打开各种网站的浏览器app推广深圳
  • 手机投资app平台汕头seo网站优化
  • wordpress跳转站点运营策划怎么做
  • 北京市建设工程质量监督网站有限公司与有限责任公司的区别
  • 开个网站建设公司需要什么软件爱站网关键词查询
  • 网站建设的培训邯郸教育行业网站建设
  • 酷站 网站开发一款交友软件多少钱