当前位置: 首页 > news >正文

【Spring Boot】使用WebSocket协议完成来单提醒及客户催单功能

1 WebSocket介绍

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

1.1 HTTP协议和WebSocket协议对比

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

1.2 WebSocket缺点

1、服务器长期维护长连接需要一定的成本,各个浏览器支持程度不一,WebSocket是长连接,受网络限制比较大
2、WebSocket不能完全取代HTTP,适用于视频弹幕、王网页聊天和体育实况更新。

2 来单提醒

用户下单并且支付成功后,需要第一时间通知外卖商家。通知的形式有如下两种:
(1)语音播报
(2)弹出提醒框

2.1 设计思路:

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

private WebSocketServer webSocketServer;
/*** 支付成功,修改订单状态*/
public void paySuccess(String outTradeNo){//当前登录用户IdLong userId = BaseContext.getCurrentId();// 根据订单号查询当前用户的订单Orders ordersDB = orderMapper.getByNumberAndUserId(outTradeNo,userId);// 根据订单id更新订单的状态、支付方式、支付状态、结账时间Orders orders = Orders.builder().id(ordersDB.getId()).status(Orders.TO_BE_CONFIRMED).payStatus(Orders.PAID).checkoutTime(localSateTime.now()).build();orderMapper.update(orders);// map是一个JS对象Map map = new HashMap();map.put("type", 1);map.put("orderId", orders.getId());map.put("content", "订单号:" + outTradeNo);// JSON字符串发送给管理端浏览器//JSON.toJSONString()函数叫做序列化//JSON.parse()函数叫做反序列化webSocketServer.sendToAllClient(JSON.toJSONString(map));
}

当商家管理端浏览器接收到这个消息之后, 前端代码负责其他工作。

2.2 什么是数据交换格式?

(1)数据交换格式,就是服务器端和客户端之间进行数据传输和交换的格式
(2)前端领域,经常提及的两种数据交换格式分别是XML和JSON。其中XML用的非常少。
(3)
在这里插入图片描述
XML
XML 的英文全称是 EXtensible Markup Language,即可扩展标记语言。因此,XML 和 HTML 类似,也是一种标记语言。
XML和HTML的区别:HTML被设计用来描述网页上的内容,是网页内容的载体;XML被设计用来传输和存储数据,是数据的载体。
XML缺点:XML格式臃肿,和数据无关的代码多,体积大,传输效率低;在javascript中解析XML比较麻烦

JSON
JSON的英文全称是javaScript Object Notation, 即“JavaScript 对象表示法”。JSON就是Javascript对象和数组的字符串表示法,它使用文本表示一个JS对象或数组的信息,因此,JSON的本质是字符串
作用:JSON是一种轻量级的文本数据交换格式,在作用上类似XML,专门用于存储和传输数据,但是JSON比XML更小,更快,更易解析。

JSON的两种结构

  1. 对象结构:对象结构在JSON中用{ }。数据结构为{key: value, key: value, …}的键值对结构。其中,key必须是使用英文的双引号包裹的字符串。
[ "java", "python", "c" ]
[ 100, 200, 300.5 ]
[ true, false, null ]
[ { "name": "zhangsan", "age": 20}, { "name": "spring", "age": 22} ]
  1. 数组结构:[ ]括起来,数据结构为[“java”, “javascript”, 30,true…]。数组中数据的类型可以是数字、字符串、布尔值、null、数组、对象6种类型。
[ "java", "python", "c" ]
[ 100, 200, 300.5 ]
[ true, false, null ]
[ { "name": "zhangsan", "age": 20}, { "name": "spring", "age": 22} ]

JSON 的作用:在计算机与网络之间存储和传输数据。
JSON 的本质:用字符串来表示 Javascript 对象数据或数组数据

3 客户催单

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

  • 语音播报
  • 弹出提示框

3.1 设计思路:

具体过程同2.1。

3.2 代码开发

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

public Result reminder(Long id){orderService.reminder(id);return Result.success();
}

Service层实现类
在orderServicelmpl中实现reminder方法:

public void reminder(Long id){//查询订单是否存在Order orders = orderMapper.getById(id);if (orders == null){throw new OrderBusinessException(MessageContant.ORDER_NOT_FOUND);
}
//基于WebSocket实现催单
Map map = new HashMap();
map.put("type", 2);
map.put("orderId",id);
map.put("content","订单号:"+ orders.getNumber());
webSocketServer.sendToAllClient(JSON.toJSONString(map));
}

Mapper层
在orderMapper中添加getById:

//根据用户id查询订单
Orders getById(Long id);

相关文章:

【Spring Boot】使用WebSocket协议完成来单提醒及客户催单功能

1 WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 1.1 HTTP协议和WebSocket协议对比 1、HTTP是短…...

如何有效的禁止Google Chrome自动更新?

禁止Chrome自动更新 1、背景2、操作步骤 1、背景 众所周知,当我们在使用Selenium进行Web自动化操作(如爬虫)时,一般会用到ChromeDriver。然而Driver的更新速度明显跟不上Chrome的自动更新。导致我们在使用Selenium进行一些操作时就…...

OpenShift 4 - 部署 RHODS 环境,运行 AI/ML 应用(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在 OpenShift 4.14 RHODS 1.33 的环境中验证 文章目录 RHODS 简介安装 RHODS 环境运行环境说明用 RHODS Operator 安装环境创建 Jupyter Notebook 运行环境 开发调式 AI/ML 应用部署运行 AI/ML 应用视频参…...

MySQL 的执行原理(二)

5.3. MySQL 的查询成本 5.3. MySQL 的查询成本 MySQL 执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者 说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模 糊的,其实在 MySQL 中一条查询语句的执行成本…...

postgres in (?,?) 和 =any(?) 用法/性能对比

刚刚回顾了一下 JDBC 操作 SQL Server 时如何传入列表参数,即如何给 in (?) 条件直接传入一个列表参数,然而本质上是不支持,最终不得不展开为 in (?, ?,...?) 针对每个元素单独设置参数,不定长的参数对于重用已编译 PreparedS…...

46. Qt Android调用Java代码进行辅助开发 -- 框架搭建

1. 说明 使用Qt进行android开发时,某种情况下使用C++的知识或者Qt提供的方法是无法满足功能需求的,即使通过各种手段能够勉强实现功能,也非常的麻烦。此时,就需要Java来辅助实现了。在Qt中提供了调用Java代码的接口,比较方便。本片博客先介绍如何搭建一个能够调用java代码…...

NX二次开发UF_CAM_PREF_set_logical_value 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREF_set_logical_value Defined in: uf_cam_prefs.h int UF_CAM_PREF_set_logical_value(UF_CAM_PREF_t pref, logical value ) overview 概述 This function sets the lo…...

docker下移除不使用的镜像、容器、卷、网络

Prune images docker image prune移除没有标签并且没有被容器引用的镜像,这种镜像称为 dangling(摇晃的) 镜像。 示例1:docker image prune 删除了redis,无标签且无引用 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STA…...

C语言基本算法之选择排序

目录 概要: 代码如下 运行结果如下 概要: 它和冒泡排序一样,都是把数组元素按顺序排列,但是方法不同,冒泡排序是把较小值一个一个往后面移,选择排序则是直接找出最小值,可以这个说&#xff…...

服务器数据恢复—raid5上层NTFS分区误删除/格式化的数据恢复案例

NTFS是windows操作系统服务器应用最为广泛的文件系统之一。理论上,NTFS文件系统格式化操作虽然不会对数据造成太大的影响,但是有可能会出现部分文件目录结构丢失的情况。下面介绍一台服务器误操作导致raid5阵列上层的NTFS分区被格式化后如何逆向操作恢复…...

【漏洞复现】IP-guard WebServer 存在远程命令执行漏洞

漏洞描述 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危…...

人工智能学习阶段有哪些?

人工智能学习阶段有哪些? 人工智能是一个跨学科、跨领域的杂交学科,未来的趋势来看,人工智能的出现使人们的生活变得更美好、更便捷,许多小伙伴想学习人工智能,其实看似人工智能比较杂多,无从下手,我们只要从以下7个阶…...

vue 中为什么需要虚拟DOM、VDOM 是如何生成的、VDOM 如何做 diff 的?

一、vue 中为什么需要虚拟DOM 1.1本概念 基本上所有框架都引入了虚拟 DOM 来对真实 DOM 进行抽象,也就是现在大家所熟知的VNode 和VDOM Virtual DOM 就是用js 对象来描述真实 DOM,是对真实 DOM 的抽象,由于直接操作 DOM 性能低但是is 层的操…...

数据分析思维与模型:相关分析法

相关分析法是一种用于研究两个或多个变量之间关系强度和方向的统计方法。这种方法在多个领域,如经济学、心理学、社会科学和自然科学中都有广泛应用。其核心是通过计算相关系数来量化变量之间的相关性。以下是相关分析法的一些基本概念和步骤: 选择变量…...

【算法萌新闯力扣】:两句话中的不常见单词

力扣热题:两句话中的不常见单词 开篇 今天是备战蓝桥杯的第19天,今天到目前刷了4道力扣算法题。其中,这道题是对我来说收获最大的一道,让我更熟练地掌握了一些算法题中方法,于是来与大家分享一下。 题目链接: 884.两…...

Xilinx Zynq-7000系列FPGA任意尺寸图像缩放,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案 3、设计思路详解HLS 图像缩放介绍 4、工程代码1:图像缩放 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2:图像缩放 LCD 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设…...

基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…...

【顺序表的应用-通讯录的实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、顺序表的应用 1. 基于动态顺序表实现通讯录 1、功能要求 2、代码实现 二、通讯录的代码实现 1.通讯录的底层结构(顺序表) (1)思路展示 (2)底层代码实现(顺序表…...

[Spring Cloud] Nacos 实战 + Aws云服务器

文章目录 前言一、拥有一台Aws Linux服务器1.1、选择Ubuntu版本Linux系统1.2、创建新密钥对1.3、网络设置1.4、配置成功,启动实例1.5、回到实例区域1.6、进入具体的实例1.7、设置安全组 二、在Mac上连接Aws云服务,并安装配置JDK112.1、解决离奇的错误2.2…...

SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

微服务注册中心 注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 微服务注册中心 服务注…...

如何启动MQTT服务器

WINR:1、cd D:\MQTT\Mosquitto2、 "D:\MQTT\mosquitto.exe" -vcd D:\MQTT\Mosquitto .\mosquitto.exe -v...

AISMM模型落地指南:5大关键步骤+3个避坑红线,90%企业踩过的转型陷阱全解析

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与数字化转型 AISMM(Artificial Intelligence-enabled Service Maturity Model)是一种面向服务演进的智能成熟度评估框架,专为支撑企业数字化转型中的AI治理…...

为Gemini CLI打造AI开发全家桶:模块化配置提升编码效率

1. 项目概述:为你的Gemini CLI打造“全家桶”式开发环境 如果你和我一样,在日常开发中重度依赖AI助手,那你肯定对Claude和Gemini这类工具不陌生。但不知道你有没有遇到过这样的痛点:每次开启一个新项目,或者想用AI完成…...

CentOS7上InfluxDB2保姆级安装与初始化配置(避坑指南)

CentOS7下InfluxDB2实战部署与深度配置指南 在物联网和APM监控领域,时序数据库的选择往往直接决定整个系统的性能上限。作为新一代时序数据库的标杆,InfluxDB2凭借其创新的IOx存储引擎和Flux查询语言,正在重塑时间序列数据处理的标准。本文将…...

用R语言SetMethods包搞定面板数据QCA分析:从数据校准到结果可视化的保姆级教程

用R语言SetMethods包实现面板数据QCA分析全流程指南 社会科学研究中的复杂因果关系往往难以用传统统计方法完全捕捉。定性比较分析(QCA)作为一种集合论方法,特别适合分析中小样本中条件组合对结果的非线性影响。当研究数据具有面板结构时(如跨国多年份数…...

智能体通信协议SmartAgentProtocol:打破AI孤岛,构建标准化协作生态

1. 项目概述:一个面向智能体的通用通信协议最近在开源社区里,一个名为SmartAgentProtocol/smartagent的项目引起了我的注意。乍一看这个标题,你可能会觉得它又是一个关于“智能体”或“Agent”的框架,毕竟现在AI领域里各种Agent框…...

如何轻松配置免费开源风扇控制软件:FanControl高效解决方案指南

如何轻松配置免费开源风扇控制软件:FanControl高效解决方案指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

Windows 10 适配 OpenClaw 2.6.6 全自动部署教程

OpenClaw 2.6.6 Windows 10 专属一键部署教程|本地 AI 智能体完整搭建指南 OpenClaw(小龙虾)是一款可在本地环境运行的 AI 智能操作工具,能够通过自然语言指令完成文件管理、办公自动化、浏览器操控、系统维护等多项电脑任务。针…...

医学影像分割新突破:5分钟快速部署MedSAM实现精准AI辅助诊断

医学影像分割新突破:5分钟快速部署MedSAM实现精准AI辅助诊断 【免费下载链接】MedSAM Segment Anything in Medical Images 项目地址: https://gitcode.com/gh_mirrors/me/MedSAM 医学影像分割是医疗AI领域的关键技术,能够帮助医生从CT、MRI等影像…...

如何用AI加速MRI扫描:FastMRI项目的完整入门指南

如何用AI加速MRI扫描:FastMRI项目的完整入门指南 【免费下载链接】fastMRI A large-scale dataset of both raw MRI measurements and clinical MRI images. 项目地址: https://gitcode.com/gh_mirrors/fa/fastMRI 想象一下,你正躺在MRI扫描仪中&…...