苍穹外卖后端开发(Day10)
Spring Task
Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。
cron 表达式
cron 表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
构成规则:分为6个或7个域,由空格分隔开,每个域代表一个含义
每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)
Spring Task 使用步骤:
- 导入maven坐标 spring-context
- 启动类添加注解 @EnableScheduling 开启任务调度
- 自定义定时任务类
订单状态定时处理
需求分析
用户下单后可能存在的情况
- 下单后未支付,订单一直处于“待支付”状态
- 用户收货后管理端未点击完成按钮,订单一直处于“派送中”状态
对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:
- 通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过15分钟仍未支付则判定未支付超时订单),如果存在则修改订单状态为“已取消”。
- 通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单,如果存在则修改订单状态为“已完成”。
WebSocket
WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
HTTP协议和WebSocket协议对比:
- HTTP是短连接
- WebSocket是长连接
- HTTP通信是单向的,基于请求响应模式
- WebSocket支持双向通信
- HTTP和WebSocket底层都是TCP连接
设计:
- 通过WebSocket实现管理端页面和服务端保持长连接状态
- 当客户支付后,调用WebSocket的相关API实现服务端向客户端推送消息
- 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语言播报
- 约定服务端发送给客户端浏览器的格式为JSON,字段包括:type, orderId, content
- type为消息类型,1为来电提醒 2为客户催单
- orderId为订单id
- content为消息内容