订单状态定时处理、来单提醒和客户催单
Spring Task:
Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。应用场景特别广泛,只要是需要定制处理的场景都可以使用Spring Task
cron表达式:cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
规则构成:分为6或7个域,由空格分隔开,每个域代表一个含义
每个域的含义分别为:秒,分钟,小时,日,月,周,年(可选)
可以使用cron表达式在线生成器,按照需求来生成cron表达式
Cron表达式规则:

L代表最后一天,用于月和周字段,其中周字段中使用L还可以指定每月的最后一个星期几,比如1L就是最后一个星期一
Spring Task使用步骤:
- 导入maven坐标spring-context
- 启动类添加注解@EnableScheduling开启任务调度
- 自定义定时任务类
订单状态定时处理:
需求分析:
用户下单后可能存在的情况:
- 下单后未支付,订单一直处于"待支付"状态
- 用户收货后管理端未点击完成按钮,订单一直处于"派送中"状态
对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:
- 通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过15分钟仍未支付则判定为支付超时订单),如果存在则修改订单状态为"已取消"
- 通过定时任务每天凌晨一点检查一次是否存在"派送中"的订单,如果存在则修改订单状态为"已完成"
代码开发:创建一个自定义任务类Task/OrderTask,用来存放自动处理订单的方法
处理超时未支付订单:每一分钟触发一次,需要先利用OrderMapper从数据库中查询到超时订单列表,然后将超时订单的状态更新为已取消,并添加取消原因和取消时间

处理超时配送中订单:每天凌晨1点触发一次,需要先利用OrderMapper从数据库中获取超时配送中订单列表,然后将状态更新为已完成

OrderMapper接口新增一个方法,用来通过状态和时间获取到所有超时订单的列表

WebSocket:
WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信–浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
全双工通信模式:

Http协议和WebSocket协议对比:
- HTTP是短连接,WebSocket是长连接
- HTTP通信是单向的,基于请求响应模式;WebSocket支持双向通信
- HTTP和WebSocket底层都是TCP连接
应用场景:
- 视频弹幕
- 网页聊天
- 体育实况更新
- 股票基金报价实时更新
后端WebSocketServer示例程序(部分),使用map来存储会话对象,一个键值对对应一个会话

WebSocket配置类:

来单提醒:
需求分析:
用户下单并且支付成功后,需要第一时间通知外卖商家,通知的形式有以下两种:
- 语音播报
- 弹出提示框
设计:
- 通过WebSocket实现管理端页面和服务端保持长连接状态
- 当客户支付后,调用WebSocket的相关API实现服务端向客户端推送消息
- 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
- 约定服务端发送给客户端浏览器的数据格式为JSON,字段包括type,orderId,content
- type为消息类型,1为来单提醒,2为客户催单
- orderId为订单id
- content为消息内容
在苍穹外卖前端代码中已经实现了WebSocket客户端的连接代码,当前端登录时会向服务端建立连接:

问题:为什么前端的请求url中只有localhost,没有端口号8080也能连接成功呢?
答:因为前端发送的请求需要经过nginx的反向代理转发后到达后端,而nginx的配置文件中已经写好了这种情况,前端使用WebSocket形式的url时,自动转发到localhost:8080端口
代码开发:
原视频:将WebSocketServer注入到OrderServiceImpl类中,并在支付成功paySuccess()方法里调用WebSocketServer里面的sendToAllClient()方法来向前端发送信息,由于sendToAllClient()方法的形参是字符串,则需要将需要传递的信息封装为JSON字符串来进行传递
改进:由于跳过了微信支付的步骤,则在下单过程中不会调用paySuccess()方法,我们需要在payment()方法中调用WebSocketServer里面的sendToAllClient()方法来向前端发送信息

客户催单:
需求分析:用户在小程序中点击催单按钮后,需要第一时间通知外卖商家。通知的形式有如下两种:
- 语音播报
- 弹出提示框
设计:
- 通过WebSocket实现管理端页面和服务端保持长连接状态
- 当用户点击催单按钮后,调用WebSocket的相关API实现服务端向客户端推送消息
- 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
- 约定服务端发送给客户端浏览器的数据格式为JSON,字段包括type,orderId,content
- type为消息类型,1为来单提醒,2为客户催单
- orderId为订单id
- content为消息内容




