苍穹外卖后端开发(Day10)

Spring Task

Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

cron 表达式

cron 表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6个或7个域,由空格分隔开,每个域代表一个含义

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

Spring Task 使用步骤:

  1. 导入maven坐标 spring-context
  2. 启动类添加注解 @EnableScheduling 开启任务调度
  3. 自定义定时任务类

订单状态定时处理

需求分析

用户下单后可能存在的情况

  • 下单后未支付,订单一直处于“待支付”状态
  • 用户收货后管理端未点击完成按钮,订单一直处于“派送中”状态

对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:

  • 通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过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为消息内容

用户下单提醒

用户催单提醒