【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

java 复制代码
private WebSocketServer webSocketServer;
/**
 * 支付成功,修改订单状态
 */
public void paySuccess(String outTradeNo){
	//当前登录用户Id
	Long 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必须是使用英文的双引号包裹的字符串。
javascript 复制代码
[ "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种类型。
javascript 复制代码
[ "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中创建催单方法:

java 复制代码
public Result reminder(Long id){
	orderService.reminder(id);
	return Result.success();
}

Service层实现类

在orderServicelmpl中实现reminder方法:

java 复制代码
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:

java 复制代码
//根据用户id查询订单
Orders getById(Long id);
相关推荐
橙子家18 小时前
Serilog 日志库简单实践(二):控制台与调试 Sinks(.net8)
后端
想不明白的过度思考者19 小时前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
陈果然DeepVersion19 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(五)
java·spring boot·kafka·向量数据库·大厂面试·rag·ai智能客服
FAFU_kyp19 小时前
Spring Boot 邮件发送系统 - 从零到精通教程
java·网络·spring boot
ConardLi20 小时前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端
芒克芒克20 小时前
ssm框架之Spring(上)
java·后端·spring
晨晖220 小时前
SpringBoot的yaml配置文件,热部署
java·spring boot·spring
冒泡的肥皂20 小时前
MVCC初学demo(二
数据库·后端·mysql
追逐时光者20 小时前
一款基于 .NET WinForm 开源、轻量且功能强大的节点编辑器,采用纯 GDI+ 绘制无任何依赖库仅仅100+Kb
后端·.net
鬼火儿20 小时前
1.2 redis7.0.4安装与配置开机自启动
java·后端