限时订单实现方案(DelayQueue、ActiveMq)

中间件(三):MQ实现订单系统异步化改造 目录 1、优化1----复杂流程加MQ 2、什么叫做同步发送消息到RocketMQ? 3、什么叫做异步发送消息到RocketMQ? 4、什么叫做发送单向消息到RocketMQ? 5、优化2---大数据大SQL 5.1、大SQL执行 ​5.2、如何将完整的订单数据发送到RocketMQ里去? 总结: 1、优化1----复杂流程加MQ 订单系统仅仅会同步执行更新订单状态和扣减库存两个最关键的操作,因为一旦你支付成功,只要保证订单状态变为“已支付”,库存扣减掉,就可以保证核心数据不错乱。 阅读详情

一、在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。

 

 

二、解决方案

    1、轮询数据库:实现一个定时器,每隔一段时间去检查一遍数据库里的所有订单,查看其状态是否是未支付并且已经到期。并修改这些数据的状态为已过期。

    优点:方法简单,容易实现

    缺点:订单状态处理不及时,轮询数据库的次数中可能很多都并没有修改订单(做的无用功),数据库频繁多次被连接浪费数据库资源开销。

因此以上方式实际开发中基本不予采用。开发中真正实现限时订单采用以下两种方案:

    2、Java本身的解决方案--DelayQueue,延时队列

    核心思想如图:

 

    (1)、用户下单,保存订单到数据库的同时,将该订单以及订单的过期时间推入DelayQueue

    (2)、启动一个检查订单到期的线程,该线程使用delayQueue的take()方法获取到期订单,该方法为阻塞方法,如果当前没有到期订单,该方法会一直阻塞等待,直到获取到订单后继续往下执行。

    (3)、当take()获取到一个到期订单后,该线程按获取到的订单的id去数据库查询订单并去检查订单状态,如果为未支付,则将状态修改为已过期

        2.1、SpringBoot框架下代码实现

      延时队列实体Bean

 

 

      延时订单业务处理接口

 

  延时订单业务处理实现类

 

 

   如果我们只实现了以上的代码,会存在一个很严重的问题,因为延时订单是存在DelayQueue中的,而DelayQueue是存在内存中的,那么当系   统重启后,DelayQueue中的数据就被清空了,因此当系统重新启动的时候,需要在订单的实现类中去做一个检索数据库订单的操作,将已过期未支付的设置为已过期,将未过期未支付的重新推入DelayQueue队列中。代码如下:

 

            @PostConstruct  注解不重复解释,上面代码中有注释

2.2、JFinal框架下代码实现

        由于项目中接口工程使用的是JFinal框架,SpringBoot框架下实现限时订单很简单,而JFinal框架下实现有一点小麻烦,特别在此进行分享

        (1)ItemVo类和SpringBoot下的一模一样。不再重复贴代码

        (2)延时订单业务接口

 

(3)延时订单业务处理实现类

 

不是使用spring的注解,这两个方法在JFinal框架下怎么调用,见下图

    首先了解一下,在JFinal框架下会有一个初始化类JFinalConfig,继承该类可以做项目的一些初始化操作

 

该类有两个方法:

afterJFinalStart() :当JFinal框架初始化完成后执行,仅执行一次

beforeJFinalStop()  :当JFinal框架关闭之前执行,仅执行一次

那么我们的延时订单线程初始化与系统重启后检测数据库订单的操作就可以放到afterJFinalStart() 里面进行执行          

 

系统关闭线程中断执行代码:

 

以上就完整实现了限时订单的功能。

3、ActiveMq消息中间件实现方案

        使用DelayQueue方案适合在单台服务器上,如果在分布式环境下,DelayQueue方案则还需要进行改进,存在的问题就是多个服务器会抢夺同一个订单,解决方案就是分区处理,每个服务器只负责自己的订单,不管其他服务器上的订单。

        使用DelayQueue的方案在功能上比较好的实现了限时订单的功能,但是可扩展性和伸缩性并不好,那么接下来使用ActiveMq实现,既能实现功能,也能更好的扩展和伸缩(消息中间件的特性就是实现系统的解耦)

        实现步骤:

           1、用户下单保存到数据库的同时使用消息生产者发送一条消息到ActiveMq消息队列,注意:并不是调用send就马上发送,而是根据过期时间进行延迟发送。时间到期了才会发送这条消息到消息队列中。

            2、当消息队列收到该消息的时候,将消息转发给订阅了该队列的消费者,消费者收到消息就去做订单状态检查

  (1)、接口实现类

 

    (2)、消息生产者--发送订单到期的消息到消息队列(按过期时间延迟发送)

 

 

             (3)、消息消费者--修改订单过期状态

 

以上三个类就是使用ActiveMq消息中间件实现限时订单的所有代码。调用代码很简单就是保存订单的同时将消息发送到消息队列,不在赘述。

大厂嵌入式面试常考八股文及算法 1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。 阅读详情

相关推荐

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3241

订单超时操作 springboot+rabbitmq实现延时队列

概述 在事情有一定时效性的时候:比如 实现一个在提交订单后的15分钟内,如果没有完成支付,系统关闭订单。有哪些可行的方案? 方案 使用定时任务轮询订单表,查询出订单创建了15分钟以上并且未支付的订单,如果有查询出此类订单则执行关闭。 使用定时任务轮询订单表,查询出订单创建了15分钟以上并且未支付的订单,如果有查询出此类订单则执行关闭。 提交订单时开启一个新线程,而新线程直接休眠15分钟,休...

isWeisen的博客 3234

LightGBM学习笔记

LightGB学习笔记1. lightgbm概述1.1 lightgbm介绍1.2 lightgbm和xgboost对比2 .直方图算法及改进2.1 直方图算法2.2 直方图算法改进2.2.1 GOSS算法3.树的生长策略4.系统设计5. 实战 lightgbm是基于boosting的学习框架,使用的是基于决策树的学习算法,具有更快的训练速度、更低的内存使用、更高的正确率、并且能够支持并行化学习,可以用来处理大规模数据,本文主要是针对学习视频https://www.bilibili.com/video/BV

一一xi的博客 3304

延迟队列实现订单超时自动取消

使用Java自带的延迟消息,系统重启或者挂了之后,消息就无法发送,不适于用在生产环境上。RabbitMQ本身不支持延迟队列,可以使用存活时间ttl+ 死信队列dlx实现消息延迟。发送的消息设置ttl,所在的队列不设置消费者。队列绑定死信队列,消息超时之后,变成死信消息,再发送给死信队列,最后发送给消费者。发送多条不同延迟时间消息,前面消息没有到延迟时间,会阻塞后面延迟更低的消息,因为队列有先进先出的特性。RabbitMQ的插件可以解决消息时序问题。带有ttl的消息发送。

qq_42700121的博客 1471

VL53L1X vs VL53L0X:激光测距传感器选型指南与性能对比

本文深入对比了VL53L1X与VL53L0X两款激光测距传感器的核心差异。VL53L1X采用区域ToF原理,在抗环境光干扰、最大测距及多目标识别方面优势显著,尤其适合复杂光线与动态场景。文章结合机器人避障、无人机定高等实战场景,提供了清晰的选型决策树,帮助工程师根据测距需求、环境复杂度与系统成本做出最优选择。

weixin_29197699的博客 393

ISP——坏点矫正(Defective Pixel Correction,DPC)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、出现原因二、坏点分类三、矫正方法动态矫正1.PINTO算法2.梯度法3.DPC和demosaic结合法4.行检测法 一、出现原因 1.感光元件芯片自身工艺技术瑕疵造成以及长期使用造成的瑕疵; 2.光线采集存在缺陷; 二、坏点分类 1.hot pixel: 固定保持较高的像素值,一般呈现为画面高亮的点; 2.dead pixel: 固定保持较低的像素值,一般在画面中呈现为暗点; 3.noise pixel:信号强度随光照呈现的.

qq_41939460的博客 9422

订单支付超时未支付关闭订单的解决方案

不要自视过高,安静点,踏实点,稳重点。——致自己

IT小辉同学 4001

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9690

Java实现订单超时未支付自动取消的8种方法总结

Redis的数据结构Zset,同样可以实现延迟队列的效果,主要利用它的score属性,redis通过score来为集合中的成员进行从小到大的排序。使用任务调度中间件xxl-job、ScheduleX、Elastic-Job等来实现,设置一个调度时间cron,到达订单过期的调度时间时,触发任务执行取消订单业务逻辑。使用RocketMQ、RabbitMQ、Kafka的延时消息,消息在发送到消息队列服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者。优点:高效,好扩展,支持分布式。

IT枫斗者的博客 1862

PyTorch实战(4)——卷积神经网络(Convolutional Neural Network,CNN)

卷积神经网络 (Convolutional Neural Network, CNN) 是一种广泛应用的深度学习模型。通过参数共享、局部感知和空间结构等优势,能够更好地处理图像数据,并在图像识别、目标检测和图像生成等任务中展现出强大的能力。在本节中,介绍了卷积的计算方法以及卷积神经网络的基本组件,并使用 PyTorch 构建了卷积神经网络以深入了解其工作原理。

盼小辉丶的博客 1万+

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1177

java mq 订单_限时订单实现方案(DelayQueue、ActiveMq)

一、在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。java开发工具下载地址及安装教程大全,点这里。 更多技术好文,在这里。二、解决方案1、轮询数据库:实现一个定时器,每隔一段时间去检查一遍数据库里的所有订单,查看其状态是否是未支付并且已经到期。并修改这些数据的状态为已过期。优点:方法简单,容易实现缺点:订单状态处理不及时,轮询数据库的次数中可能很多都并没有...

weixin_34870207的博客 1182

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

一、基本概念CiteSpace(引文空间)是一款专注于分析科学分析中蕴含的潜在知识的软件。它是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。通过可视化的手段,CiteSpace能够呈现科学知识的结构、规律和分布情况,并因此将这种分析得到的可视化图形称为“科学知识图谱”。二、主要功能和用途知识图谱构建:根据科学文献的引用关系,CiteSpace可以生成知识图谱,帮助研究人员更好地理解学术领域中不同文献之间的联系和演化过程。主题聚类分析。

m0_64336780的博客 1万+

java限时代码_限时订单设计

一、在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。二、解决方案1、轮询数据库:实现一个定时器,每隔一段时间去检查一遍数据库里的所有订单,查看其状态是否是未支付并且已经到期。并修改这些数据的状态为已过期。优点:方法简单,容易实现缺点:订单状态处理不及时,轮询数据库的次数中可能很多都并没有修改订单(做的无用功),数据库频繁多次被连接浪费数据库资源开销。因此以上方式...

weixin_33398033的博客 482

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

限时订单

限时订单实现方案(DelayQueue、ActiveMq) 一、在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。 二、解决方案 1、轮询数据库:实现一个定时器,每隔一段时间去检查一遍数据库里的所有订单,查看其状态是否是未支付并且已经到期。并修改这些数据的状态为已过期。 优点:方法简单,容易实现 缺点:订单状态处理不及时,轮询数据库的次数中可能很多都...

qq_30443907的博客 550

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

限时订单设计

一、在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。 二、解决方案 1、轮询数据库:实现一个定时器,每隔一段时间去检查一遍数据库里的所有订单,查看其状态是否是未支付并且已经到期。并修改这些数据的状态为已过期。 优点:方法简单,容易实现 缺点:订单状态处理不及时,轮询数据库的次数中可能很多都并没有修改订单(做...

weixin_34107955的博客 254

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

解决限时支付 限时订单问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34395205的博客 455

延时队列DelayQueue 订单过期自动清除

模拟一个场景,用户下单后迟迟未付款, 我们需要在30分钟后取消订单, 释放库存. 首先做个延迟队列的泛型类 需要实现Delayed @Data public class DelayTask implements Delayed { private String taskName;//任务名称 private long expire ;//到期时间 public DelayTask(String taskName, long secondsDelay) { s

weixin_45369440的博客 1413

用户提交订单后怎么设置有效时间?

PMCAFF产品经理 12-01互金中理财产品抢购时,用户提交订单后怎么设置订单有效时间场景:总额度 50000 的理财产品,用户 A 提交了 50000 额度的订单一直未支付,平台一直保留额度,其他用户无法购买。是否要设置订单有效时间来防止此类情况发生?或者是有更好的办法解决该问题产品白 华汽 产品 昨天 09:45谢邀,首先明确订单流程中扣除库存的节点:订单提交扣除、订单提交支付扣除;1、订单...

qq_37779709的博客 4804

面试高频:为什么不用定时任务实现关闭订单?

在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?一般的做法有如下几种:定时任务关闭订单rocketmq延迟队列rabbitmq死信队列时间轮算法redis过期监听一、定时任务关闭订单(最low)一般情况下,最不推荐的方式就是关单方式就是定时任务方式,原因我们可以看下面的图来说明。我们假设,关单时间为下单后10分钟,定时任务间隔也是10分钟;通过上图我们看出

chenxuyuana的博客 529

电子商务(电销)平台中订单模块(Order)数据库设计明细

电子商务(电销)平台中订单模块(Order)数据库设计明细 以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 订单表 (order) |-- 自动编号(order_id, 自增长主键) |-- 订单单号(order_no, 唯一值,供客户查询) |-- 商店编号(shop_id, 商店表自动编号) |-- 订单状态 (order_status,未付款,已付款,已发货,已签收,退货申请,退货中,已退货,取消交易) |-- 商品数量 (product_

沉在水底的鱼的博客 3779

Spring-Task实现订单前5分钟,后30分钟,后1个小时短信通知

一、问题描述 最近在开发支付,有三个需求如下: 1.当用户选择某个医生的时间,进行预约,然后下单,下单之后成功支付,在预约时间的前5分钟,实现短信,通知。 2.当用户下单之后半个小时,没有支付,把订单状态改为取消。 3.当用户下单之后,成功支付,一个小时之后有医生对他咨询,把状态改为过期。 二、解决方法 像上面的三种情况肯定得使用定时器,来进行处

fendo 5689

限时订单实现方案

1. 限时订单? 在各种电商网站下订单后会保留一个时间段,时间段内未支付则自动将订单状态设置为已过期。 2. 限时订单现象 在我们生活中处处可见限时订单的现象,如:在淘宝购物下单后没有付款,会提示多长时间订单失效;春季过年回家买火车 票,下了订单后半个小时不付款改订单就会取消;点外卖。。。 3. 解决方法一 轮询数据库:到实现...

qq_25432245的博客 1309

Java延迟队列——DelayQueue

DelayQueue是一个无界的BlockingQueue,是线程安全的(无界指的是队列的元素数量不存在上限,队列的容量会随着元素数量的增加而扩容,阻塞队列指的是当队列内元素数量为0的时候,试图从队列内获取元素的线程将被阻塞或者抛出异常)以上是阻塞队列的特点,而延迟队列还拥有自己如下的特点:DelayQueue中存入的必须是实现了Delayed接口的对象。

qq_25046827的博客 8914

关于实现订单超时的几种方案

先描述一下业务场景,用户下单后在规定时间内没有完成支付,那么系统需要把订单终结掉。 但是这个规定时间可能不是定死的,它可能是3小时,2小时,30分钟等等 个人的实现思路 一、轮询数据库 这种方式就是在保存订单的时候把订单的超时时间也一起保存进去,然后用定时任务去轮询数据库获取未支付的订单,再去判断是否超时了。 但是!这种方法太捞了呀,而且也不具备实时性,比如我有个订单号为:123的订单是在10:00:00这个时间超时,但是我的定时任务是每5分钟执行一次,它又恰好是在09:58:00执行了一次任务,那么它这个

LIKEGAKKI的博客 7528

用activemq做一个超时删除

1,安装activemq http://activemq.apache.org/download.html官网上下载 有windows和linux两种 windows的安装 :把下载的文件解压,复制到d盘中,然后打开bin里面的win64,里面有个InstallService,双击就行了,然后右键我的电脑,点击 服务和应用程序,找到 启动就行了 打开http://localhost:8161/...

qq_43302785的博客 1018
上一篇: java并发之DelayQueue实际运用示例
下一篇: 什么时候使用CountDownLatch
rmnjava
博客等级 码龄20年 8粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值