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

百度有没有做游戏下载网站做问卷的网站

百度有没有做游戏下载网站,做问卷的网站,单位公众号怎么制作,农业局网站建设实施方案转自#xff1a; https://juejin.cn/post/6844903903130042376 文末有源代码#xff0c;非常棒 摘要#xff1a; 本篇博文是“Java秒杀系统实战系列文章”的第十篇#xff0c;本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后#xff0c;却迟…转自 https://juejin.cn/post/6844903903130042376 文末有源代码非常棒 摘要 本篇博文是“Java秒杀系统实战系列文章”的第十篇本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后却迟迟没有支付”的情况一起来见识一下RabbitMQ死信队列在实际业务环境下的强大之处内容对于消息中间件RabbitMQDebug其实在前面的篇章中已经简单分享介绍过了在这里就不再赘述了在本文我们将采用RabbitMQ的死信队列实现这样的业务需求“用户在秒杀成功并成功创建一笔订单记录后理论上应该是执行去支付的操作但是却存在着一种情况是用户迟迟不肯去支付~至于原因不得而知”对于这种场景各位小伙伴可以在一些商城平台体验一下即挑选完商品加入购物车后点击去结算这个时候会有个倒计时提醒你需要在指定的时间内完成付款否则订单将失效对于这种业务逻辑的处理传统的做法是采用“定时器的方式”定时轮询获取已经超过指定时间的订单然后执行一系列的处理措施比如再争取给用户发送短信提醒超过多长时间订单就要失效了等等。。。在这个秒杀系统中我们将借助RabbitMQ死信队列这一组件对该订单执行“失效”的措施“死信队列”顾明思议是可以延时、延迟一定的时间再处理消息的一种特殊队列它相对于“普通的队列”而言可以实现“进入死信队列的消息不立即处理而是可以等待一定的时间再进行处理”的功能而普通的队列则不行即进入队列后的消息会立即被对应的消费者监听消费如下图所示为普通队列的基本消息模型而对于“死信队列”它的构成以及使用相对而言比较复杂一点在正常情况死信队列由三大核心组件组成死信交换机死信路由TTL消息存活时间~非必需的而死信队列又可以由“面向生产者的基本交换机基本路由”绑定而成故而生产者首先是将消息发送至“基本交换机基本路由”所绑定而成的消息模型中即间接性地进入到死信队列中当过了TTL消息将“挂掉”从而进入下一个中转站即“面下那个消费者的死信交换机死信路由”所绑定而成的消息模型中。如下图所示下面我们以实际的代码来构建死信队列的消息模型并将此消息模型应用到秒杀系统的上述功能模块中。1首先需要在RabbitmqConfig配置类创建死信队列的消息模型其完整的源代码如下所示//构建秒杀成功之后-订单超时未支付的死信队列消息模型 Bean public Queue successKillDeadQueue(){     MapString, Object argsMap Maps.newHashMap();     argsMap.put(x-dead-letter-exchange,env.getProperty(mq.kill.item.success.kill.dead.exchange));     argsMap.put(x-dead-letter-routing-key,env.getProperty(mq.kill.item.success.kill.dead.routing.key));     return new Queue(env.getProperty(mq.kill.item.success.kill.dead.queue),true,false,false,argsMap); } //基本交换机 Bean public TopicExchange successKillDeadProdExchange(){     return new TopicExchange(env.getProperty(mq.kill.item.success.kill.dead.prod.exchange),true,false); } //创建基本交换机基本路由 - 死信队列 的绑定 Bean public Binding successKillDeadProdBinding(){     return BindingBuilder.bind(successKillDeadQueue()).to(successKillDeadProdExchange()).with(env.getProperty(mq.kill.item.success.kill.dead.prod.routing.key)); } //真正的队列 Bean public Queue successKillRealQueue(){     return new Queue(env.getProperty(mq.kill.item.success.kill.dead.real.queue),true); } //死信交换机 Bean public TopicExchange successKillDeadExchange(){     return new TopicExchange(env.getProperty(mq.kill.item.success.kill.dead.exchange),true,false); } //死信交换机死信路由-真正队列 的绑定 Bean public Binding successKillDeadBinding(){     return BindingBuilder.bind(successKillRealQueue()).to(successKillDeadExchange()).with(env.getProperty(mq.kill.item.success.kill.dead.routing.key)); } 复制代码其中环境变量对象实例env读取的变量是配置在application.properties配置文件中的取值如下所示#订单超时未支付自动失效-死信队列消息模型 mq.kill.item.success.kill.dead.queue${mq.env}.kill.item.success.kill.dead.queue mq.kill.item.success.kill.dead.exchange${mq.env}.kill.item.success.kill.dead.exchange mq.kill.item.success.kill.dead.routing.key${mq.env}.kill.item.success.kill.dead.routing.key mq.kill.item.success.kill.dead.real.queue${mq.env}.kill.item.success.kill.dead.real.queue mq.kill.item.success.kill.dead.prod.exchange${mq.env}.kill.item.success.kill.dead.prod.exchange mq.kill.item.success.kill.dead.prod.routing.key${mq.env}.kill.item.success.kill.dead.prod.routing.key #单位为ms mq.kill.item.success.kill.expire20000 复制代码2成功创建了消息模型之后紧接着我们需要在通用的RabbitMQ发送消息服务类RabbitSenderService中开发“发送消息入死信队列”的功能在该功能方法中我们指定了消息的存活时间TTL取值为配置的变量mq.kill.item.success.kill.expire 的值即20s其完整的源代码如下所示//秒杀成功后生成抢购订单-发送信息入死信队列等待着一定时间失效超时未支付的订单 public void sendKillSuccessOrderExpireMsg(final String orderCode){     try {         if (StringUtils.isNotBlank(orderCode)){             KillSuccessUserInfo infoitemKillSuccessMapper.selectByCode(orderCode);             if (info!null){                 rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());                 rabbitTemplate.setExchange(env.getProperty(mq.kill.item.success.kill.dead.prod.exchange));                 rabbitTemplate.setRoutingKey(env.getProperty(mq.kill.item.success.kill.dead.prod.routing.key));                 rabbitTemplate.convertAndSend(info, new MessagePostProcessor() {                     Override                     public Message postProcessMessage(Message message) throws AmqpException {                         MessageProperties mpmessage.getMessageProperties();                         mp.setDeliveryMode(MessageDeliveryMode.PERSISTENT);                         mp.setHeader(AbstractJavaTypeMapper.DEFAULT_CONTENT_CLASSID_FIELD_NAME,KillSuccessUserInfo.class); //TODO动态设置TTL(为了测试方便暂且设置20s)                         mp.setExpiration(env.getProperty(mq.kill.item.success.kill.expire));                         return message;                     }                 });             }         }     }catch (Exception e){         log.error(秒杀成功后生成抢购订单-发送信息入死信队列等待着一定时间失效超时未支付的订单-发生异常消息为{},orderCode,e.fillInStackTrace());     } } 复制代码从该“发送消息入死信队列”的代码中我们可以看到消息首先是先入到“基本交换机基本路由”所绑定的死信队列的消息模型中的当消息到了TTL自然会从死信队列中出来即“解脱了”然后进入下一个中转站即“死信交换机死信路由” 所绑定而成的真正队列的消息模型中最终真正被消费者监听消费此时可以将整个项目、系统运行在外置的tomcat服务器中然后打开RabbitMQ后端控制台应用找到该死信队列可以看到该死信队列的详细信息如下图所示3最后是需要在RabbitMQ通用的消息监听服务类RabbitReceiverService 中监听“真正队列”中的消息并进行处理在这里我们是对该订单进行失效处理前提是还没付款的情况下其完整的源代码如下所示//用户秒杀成功后超时未支付-监听者 RabbitListener(queues {${mq.kill.item.success.kill.dead.real.queue}},containerFactory singleListenerContainer) public void consumeExpireOrder(KillSuccessUserInfo info){     try {         log.info(用户秒杀成功后超时未支付-监听者-接收消息:{},info); if (info!null){             ItemKillSuccess entityitemKillSuccessMapper.selectByPrimaryKey(info.getCode());             if (entity!null entity.getStatus().intValue()0){                 itemKillSuccessMapper.expireOrder(info.getCode());             }         }     }catch (Exception e){         log.error(用户秒杀成功后超时未支付-监听者-发生异常,e.fillInStackTrace());     } } 复制代码其中失效更新订单的记录的操作由 itemKillSuccessMapper.expireOrder(info.getCode()); 来实现其对应的动态Sql的写法如下所示!--失效更新订单信息-- update idexpireOrder   UPDATE item_kill_success   SET status -1   WHERE code #{code} AND status 0 /update 复制代码4至此关于RabbitMQ死信队列消息模型的代码实战已经完毕了最后我只需要在“用户秒杀成功创建订单的那一刻发送消息入死信队列”的地方调用即可其调用代码如下所示/**  * 通用的方法-记录用户秒杀成功后生成的订单-并进行异步邮件消息的通知  * param kill  * param userId  * throws Exception  */ private void commonRecordKillSuccessInfo(ItemKill kill, Integer userId) throws Exception{     //TODO:记录抢购成功后生成的秒杀订单记录 ItemKillSuccess entitynew ItemKillSuccess();     String orderNoString.valueOf(snowFlake.nextId()); //entity.setCode(RandomUtil.generateOrderCode());   //传统时间戳N位随机数     entity.setCode(orderNo); //雪花算法     entity.setItemId(kill.getItemId());     entity.setKillId(kill.getId());     entity.setUserId(userId.toString());     entity.setStatus(SysConstant.OrderStatus.SuccessNotPayed.getCode().byteValue());     entity.setCreateTime(DateTime.now().toDate());     //TODO:学以致用举一反三 - 仿照单例模式的双重检验锁写法     if (itemKillSuccessMapper.countByKillUserId(kill.getId(),userId) 0){         int resitemKillSuccessMapper.insertSelective(entity); if (res0){             //TODO:进行异步邮件消息的通知rabbitmqmail             rabbitSenderService.sendKillSuccessEmailMsg(orderNo); //TODO:入死信队列用于 “失效” 超过指定的TTL时间时仍然未支付的订单             rabbitSenderService.sendKillSuccessOrderExpireMsg(orderNo);         }     } } 复制代码最后是进行自测点击“抢购”按钮用户秒杀成功后会发送一条消息入死信队列这一点可以在RabbitMQ后端控制台中可以看到一条正Ready好的消息等待20s即可看到消息转移到真正的队列并被真正的消费者监听消费如下所示 好了关于“RabbitMQ死信队列”的介绍以及应用实战本文就暂且介绍到这里了此种方式可以很灵活对“超时未支付的订单”进行很好的处理而且整个过程是“自动、自然”的而无需人为去手动点击按钮触发了当然啦万事万物都并非十全十美的死信队列也是如此在一篇文章中我们将介绍此种方式的瑕疵之处并采用相应的解决方案进行处理补充1、目前这一秒杀系统的整体构建与代码实战已经全部完成了 完整的源代码数据库地址可以来这里下载 https://gitee.com/steadyjack/SpringBoot-SecondKill
http://www.zqtcl.cn/news/308832/

相关文章:

  • 盐城网站建设代理商wordpress定义字体颜色
  • 成都旅游网站建设地址自己做的网站怎么被搜索出来
  • 网站建设免费免代码商城微网站如何做
  • 网站建设域名是什么东莞网络科技营销
  • 法语网站建设高端网站建设 骆
  • vue网站开发注意事项做设计想接外单去哪个网站好
  • 免费模板下载网站推荐苏州seo
  • 徐州市水利工程建设有限公司网站网站建设技术团队有多重要性
  • 合肥佰瑞网站搜索引擎优化步骤
  • 营销型网站建设亏1广西桂林天气预报15天
  • 想做一个网站平台怎么做公司网站建设费用估计
  • 电商网站开发平台pi netwo网页设计文件下载
  • 南平网站设计笔记本怎么建设网站
  • 舆情分析网站免费人工智能培训班收费标准
  • 青岛网站建设 大公司制作相册视频
  • 什么是网站的域名jquery素材网站
  • 课程网站建设ppt模板百度seo推广
  • 网站建设需要用到什么怎么在电脑上用手机app软件
  • 公司做网站有意义么网站认证必须做么
  • 网站虚拟空间更新缓存php外贸网站建设
  • 河南省建设执业资格注册中心网站门户定制网站建设公司
  • 网站开发比较厉害wordpress中文 插件
  • 文化投资的微网站怎么做个人微信公众号如何推广
  • 单位的网站怎样设计才美观网页设计图片的代码
  • 长沙专业做网站排名济南手机网站定制费用
  • 西安专题门户响应式网站建设系统网站有哪些
  • 山东省建设局网站监理员考试asp.net mvc6电商网站开发实践
  • 做网站需要提供什么资料网站备案是什么意思
  • 河南网站建设及推广东莞百度代做网站联系方式
  • 大型企业网站制作浦东新区做网站