• 苍穹外卖day10(2)WebSocket、来单提醒、客户催单



    前言

    websocket支持双向通信,通常用于数据实时更新。本项目中用于来单提醒和客户催单,当用户支付成功时,系统会提示客户来单;在用户端,客户点击催单按钮,系统会提示客户催单。


    一、WebSocket

    1. 概述

    基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。
    应用场景
    视频弹幕
    网页聊天
    体育实况更新
    股票基金报价实时更新

    2. HTTP协议和WebSocket协议对比

    • HTTP是短连接
    • WebSocket是长连接
    • HTTP通信是单向的,基于请求响应模式
    • WebSocket支持双向通信
    • HTTP和WebSocket底层都是TCP连接

    WebSocket缺点
    服务器长期维护长连接需要一定的成本
    各个浏览器支持程度不一
    WebSocket 是长连接,受网络限制比较大,需要处理好重连

    结论:WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用
    在这里插入图片描述

    3. 实现步骤

    1、直接使用websocket.html页面作为WebSocket客户端
    2、导入WebSocket的maven坐标
    3、导入WebSocket服务端组件WebSocketServer,用于和客户端通信
    4、导入配置类WebSocketConfiguration,注册WebSocket的服务端组件
    5、导入定时任务类WebSocketTask,定时向客户端推送数据

    二、来单提醒

    1. 业务规则

    用户下单并且支付成功后,需要第一时间通知外卖商家。通知的形式有如下两种:

    • 语音播报
    • 弹出提示框

    2. 接口设计

    1. 通过WebSocket实现管理端页面和服务端保持长连接状态
    2. 当客户支付后,调用WebSocket的相关API实现服务端向客户端推送消息
    3. 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
    4. 约定服务端发送给客户端浏览器的数据格式为JSON,字段包括:type,orderId,content
      type 为消息类型,1为来单提醒 2为客户催单
      orderId 为订单id
      content 为消息内容

    3. 代码实现

    1、在config包下设置WebSocketConfiguration配置类

    @Configuration
    public class WebSocketConfiguration {
      @Bean
       public ServerEndpointExporter serverEndpointExporter() {
           return new ServerEndpointExporter();
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、在OrderServiceImpl中注入WebSocketServer对象,修改paySuccess方法

    //注入 WebSocketServer
    @Autowired
    private WebSocketServer webSocketServer;
    public void paySuccess(String outTradeNo) {
       ...
       //通过websocket向客户端浏览器推送消息 type orderId content
       Map map = new HashMap();
       map.put("type",1);  //1表示来单提醒 2表示客户催单
       map.put("orderId",ordersDB.getId());
       map.put("content","订单号:"+outTradeNo);
       String json = JSON.toJSONString(map);
       webSocketServer.sendToAllClient(json);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、客户催单

    1. 业务规则

    用户在小程序中点击催单按钮后,需要第一时间通知外卖商家。通知的形式有如下两种:

    • 语音播报
    • 弹出提示框

    2. 接口设计

    和来单提醒一样,当用户点击催单按钮后,就会推送消息到管理端
    在这里插入图片描述

    3. 代码实现

    1、根据用户催单的接口定义,在user/OrderController中创建催单方法

     @GetMapping("/reminder/{id}")
     @ApiOperation("催单提醒")
      public Result reminder(@PathVariable Long id){
          orderService.reminder(id);
          return Result.success();
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、在OrderService接口中声明reminder方法,在OrderServiceImpl中实现

    public void reminder(Long id) {
        Orders ordersDB = orderMapper.getById(id);
        // 校验订单是否存在
        if (ordersDB == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        Map map = new HashMap();
        map.put("type",2);  //1表示来单提醒 2表示客户催单
        map.put("orderId",ordersDB.getId());
        map.put("content","订单号:"+ ordersDB.getNumber());
        String json = JSON.toJSONString(map);
        //通过websocket向客户端浏览器推送消息
        webSocketServer.sendToAllClient(json);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    35【源码】数据可视化:基于 Echarts + Python 动态实时大屏 - 门店销售业绩数据中心
    回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测
    redis入门-1-redis概念和基础
    4.2 Hive SQL
    python实现选择排序算法
    Elasticsearch
    一文了解线上展厅如何制作,线上展厅制作需要注意什么
    oracle常见错误
    设计模式-day02
    Linux进程间通信
  • 原文地址:https://blog.csdn.net/qq_51076441/article/details/138094787