来宾住房和城乡建设局网站,怎么建网站和网站模块,网站模板组件,wordpress pdf viewer简介
在电子商务及支付相关平台中#xff0c;常规流程是首先生成订单或支付请求#xff0c;用户随后会在规定时间内完成支付。如果用户未能在预设时限内完成支付动作#xff0c;系统通常会执行相应的过期处理机制#xff0c;即自动取消未支付的订单。
此外#xff0c;这…简介
在电子商务及支付相关平台中常规流程是首先生成订单或支付请求用户随后会在规定时间内完成支付。如果用户未能在预设时限内完成支付动作系统通常会执行相应的过期处理机制即自动取消未支付的订单。
此外这类系统还设置了多种自动化业务规则来处理其他时效性较强的场景例如
到期自动确认收货当商品配送预计到达时间过后若用户未主动确认收货系统将自动视为用户已收货并触发后续评价或售后环节。超时自动退款对于某些未及时处理的退款申请或者因物流异常等原因导致的退款系统在达到预设等待期限后会自动退还消费者款项。下单后自动通知一旦用户下单成功系统会自动触发短信或邮件通知服务向用户发送订单确认信息或其他相关信息。
以上这些功能都是为了提高系统的自动化水平和用户体验减少人工干预的需求并确保交易过程顺畅高效 实现方式
被动关闭不推荐
在电子商务系统中一旦创建了订单系统并不会主动介入进行关闭操作而是静待用户行为仅当用户实际访问或查询订单状态时系统才会实时进行评估以判断是否满足应当关闭订单的条件。缺点就是如果用户一直没有访问订单则会导致订单一直处于未关闭的状态这时数据库中会堆积大量垃圾数据
Slf4j
Service
public class PassiveShutdownServiceImpl implements OrderShutdown {Autowiredprivate OrderMapper orderMapper;/*** 方法一被动关闭*/Overridepublic void orderShutdown() {//假设订单id为1Long orderId 1L;Order order orderMapper.findOrderById(orderId);//省略其他相关业务判断......//判断当前是否大于到期时间if(order.getExpireTime().compareTo(new Date())-1){//修改订单状态log.info(当前时间大于到期时间);int result orderMapper.updateOrderStatus(orderId);//省略判断是否修改成功相关逻辑}}
}
select idfindOrderById resultTypecom.yiridancan.delayShutdown.entity.Order parameterTypelongselect * from t_order where id#{orderId} and order_status!CLOSED
/selectupdate idupdateOrderStatus parameterTypelongupdate t_order set order_statusCLOSED where id#{orderId}
/update
测试代码
SpringBootTest
class DelayShutdownApplicationTests {Autowiredprivate PassiveShutdownServiceImpl passiveShutdownService;/** * 延期关闭测试类。通过策略模式指定方法* author yiridancan* date 2024/4/3 22:56*/Testvoid delayShutdown() {OrderShutdown orderShutdown passiveShutdownService;orderShutdown.orderShutdown();}}
定时任务推荐适用于时间精准度不高的场景
定时任务就是定时去扫描表中数据进行订单关闭实现比较简单就不提供具体示例代码
缺点 时间不精准如果一个订单到了关闭时间但定时任务时间还没到就会导致订单一直没有关闭 无法处理大订单量如果数据量大的情况下那么就有可能导致任务执行时间很长订单被扫描到时间可能就很晚那么就会导致关闭时间更晚 数据库压力大定时任务扫描表数据会占用数据库的IO资源。严重时会导致线上的正常业务
Redission推荐
Redisson是一个在Redis的基础上实现的框架它不仅提供了一系列的分布式的Java常用对象还提供了许多分布式服务。可以通过Redission中的RDelayedQueue延迟队列实现订单到期关闭它可以用于在指定的时间后执行某些操作。底层主要是用到了Redis的zset数据结构并且在这基础上增加了一个延迟队列。我们要添加一个数据到延迟队列的时候redisson会把数据超时时间放到zset中并且起一个延时任务当任务到期的时候再去zset中把数据取出来返回给客户端使用。
1.添加依赖 2.配置Redission
创建一个Redission配置类用于创建Redission 3.创建订单服务
创建一个订单服务类使用 RDelayedQueue 来实现订单到期关闭的逻辑 4.创建订单
创建订单controller层用于模拟订单创建并设置关闭时间 5.启动应用
启动应用并访问http://ip:host/orders/create?expireTime关闭时间进行默认订单创建 运行效果 创建订单成功 Redis队列数据 到期关闭结果 可见2分钟后订单id为2024-10-12 13:43:21定时关闭了 6.注意事项 确保Redis服务器正在运行根据需要调整延迟时间和其他业务逻辑处理并发和异常处理以确保在实际环境中的可靠性如遇到以下异常升级Redis版本进行处理 Redission案例源码地址如何优雅的通过SpringBootRedission对订单实现定时关闭资源-CSDN文库
总结 这里只列举了部分实现方式比如还可以通过MQ不推荐会有大量无效调度数据、时间轮、Redis的过期监听等。不同的场景适用于不同的技术方案没有决定的技术 在CSDN上一键三连是对作者辛勤创作的最好鼓励喜欢我的文章就请点赞、收藏、转发吧你们的支持是我持续分享知识的动力感谢大家的陪伴与认可