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

二、解决方案

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消息中间件实现限时订单的所有代码。调用代码很简单就是保存订单的同时将消息发送到消息队列,不在赘述。

java限时代码_限时订单设计相关推荐

  1. java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

    java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...

  2. java恋爱代码_陷入与代码的恋爱中:终生的爱情故事

    java恋爱代码 by Daragh Byrne 达拉·伯恩(Daragh Byrne) 陷入与代码的恋爱中:终生的爱情故事 (Falling in and out of love with code ...

  3. java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势

    java 编写代码 去年我们有机会遇到的最有趣趋势的实用概述 在这篇文章中,我们回顾了构成我们2015年对话的5个主题和新发展.与其他许多年终总结保持较高水平的不同,我们将做一个更实际的操作不用流行语 ...

  4. 每行代码都有注释释的java面向对象代码_每行代码都有注释释的java面向对象代码...

    每行代码都有注释释的java面向对象代码 [2021-02-02 01:52:34]  简介: vue如何注释 2020-11-18 vue注释的方法:1.html注释,代码为[]:2.[pug(ht ...

  5. java积分管理系统代码_【全套设计下载】JAVA某店POS积分管理系统(源代码+论文)...

    [全套设计下载]JAVA某店POS积分管理系统(源代码+论文) 摘 要 开发一个大而复杂的POS积分管理软件系统,将它进行适当的分解,不但可以降低其复杂性,还可以减少开发工作量,降低开发成本,提高软件 ...

  6. java限时抢购_限时抢购-倒计时的完整实例(分享)

    如下所示: 团购--限时抢 还剩 function FreshTime() { var endtime = new Date("2017/10/15,12:20:12");//结束 ...

  7. java 云 代码_云端如何编写Java代码

    [IT168 技术]正如云厂商和虚拟计算提供商所宣传的转移到云端是一个无缝的流程,经验却告诉我们过于猛烈地脱离内部数据中心,部署到云端是一种复杂的方式.从部署流程到方式的所有事情,应用的监控.调试并性 ...

  8. 网上书店管理系统java部分代码_网上书店管理系统 java语言

    [实例简介] 整个系统,包括数据库,安装上就能用,非常适合做课程设计的作业或者毕业设计的作业 [实例截图] [核心代码] OnLineBookStore └── OnLineBookStore ├── ...

  9. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

最新文章

  1. 谷歌浏览器输入框背景颜色变黄的解决方案
  2. Python编程基础:第五十八节 线程Threading
  3. SpringBoot中在配置文件中限制文件上传的大小
  4. dagger2记录篇
  5. 谈表达式树的缓存(7):五种缓存方式的总体分析及改进方案
  6. oracle数据库11gr2,Oracle 11g R2 X64数据库安装
  7. [转]Java学习路线图(完整详细2019版)
  8. linux下python 2.4升级到 python 2.5
  9. java用gui如何写退格_emWin(ucGui)的Edit控件退格处理方法 worldsing
  10. THUWC2017 随机二分图
  11. 哪个服务器比较稳定,云服务器哪个比较稳定
  12. UltraISO 创建的虚拟光驱更改盘符
  13. 安装3dmax2020版本注意事项
  14. ug如何复制面_了解了一下内容,让你UG快速入门
  15. oracle 排序性能优化,Oracle优化之: 利用索引的有序性减少排序
  16. DONET中常用的一些快捷键收集。
  17. Flask-SQLAlchemy牛刀小试
  18. Hyperledger Fabric教程--Peer命令
  19. 微信永久封号怎么解封?微信社交场景被限制解决办法
  20. 【html】css字体样式

热门文章

  1. system(cls) 是什么意思
  2. HGS(主机保护者服务)配置
  3. ASP用替换函数给文章内容所有图片加上alt属性内容
  4. 三万字「2021」DeFi行业全景扫描
  5. 匿名信V1.4.5.1版本更新“数据大屏”功能
  6. 腾讯员工平均月薪85473元?网友:小马哥快分我资产
  7. 第五章 数据通信与计算机网络
  8. pandas因为内存不够无法一次性读取
  9. 草nbsp;的nbsp;联nbsp;想
  10. 电脑开不了机怎么办?排查这3种情况