欢迎光临
我们一直在努力

黑马苍穹外卖笔记day10

订单状态定时处理、来单提醒和客户催单

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为消息内容
赞(0)
未经允许不得转载:171主机测评 » 黑马苍穹外卖笔记day10
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址