苍穹外卖 新订单提醒

ops/2024/11/13 21:23:27/

        通过WebSocket技术实现新订单提醒功能,每当有新的订单,就在商家管理端发送消息提示。

        WebSocketServer

java">package com.sky.Websocket;import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;// TODO WebSocket日后也可以算是亮点
// WebSocket是一种基于TCP的新的网络协议,它实现了浏览器和服务器的全双工通信————浏览器和服务器只需要完成一次握手,二者就
// 可以创建持久性的连接,并可以进行双向的数据传输// Http和WebSocket相比:
// 1.Http是短连接,WebSocket是长连接
// 2.Http是单向通信的,是基于请求响应模式完成的;WebSocket是双向通信的,不需要请求响应也可以完成通信
// 3.但Http和WebSocket二者底层都是TCP连接的// WebSocket支持双向通信,功能强大,是否可以通过WebSocket开发所有业务功能,从而取代Http?
// 其实是不行的,WebSocket有很多优点的同时,也伴随着许多缺点:1.长连接是需要很多资源的,服务器维护长连接需要成本
// 2.浏览器的支持程度不同,所以说兼容性存在问题     3.WebSocket是长连接,所以说受网络限制较大,需要处理重连问题
// 所以说WebSocket不能完全取代Http,只适合在特定的场景下使用// WebSocket的使用场景:不需要请求响应就可以直接更新的网页,浏览器既可以向服务器发送消息,服务器也可主动向浏览器推送消息
// 如:视频弹幕、网页聊天、体育实况更新、股票基金报价实时更新;主要是一些需要实时数据更新的场景// 在maven项目中使用WebSocket
// 1.导入WebSocket的maven坐标
// 2.导入WebSocket服务端组件WebSocketServer,用于和客户端通信
// 3.导入配置类WebSocketConfiguration,注册WebSocket的服务端组件
// 4.编写代码逻辑,判断什么时候需要向客户端推送数据/*** WebSocket服务**/
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {// 存放会话对象private static Map<String, Session> sessionMap = new HashMap<>();/*** 连接建立成功调用的方法** @param session* @param sid*/@OnOpenpublic void onOpen(Session session, @PathVariable String sid) {System.out.println("客户端" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息之后调用的方法** @param message* @param sid*/@OnMessagepublic void onMessage(String message, @PathVariable String sid) {System.out.println("收到来自客户端:" + sid + "的信息是:" + message);}/*** 关闭连接调用方法** @param sid*/@OnClosepublic void onClose(@PathVariable String sid) {System.out.println("连接断开:" + sid);sessionMap.remove(sid);}/*** 群发** @param message*/// 因为可能有很多客户端都连接了这个服务端,所以说在更新数据的时候需要群发,为所有连接了的客户端都更新public void sendToAllClients(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {// 服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}
}

        OrderServiceImpl

java">/*** 支付成功,修改订单状态** @param outTradeNo*/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(LocalDateTime.now()).build();orderMapper.update(orders);// 支付成功后,第一时间通知外卖商家(来单提醒)// 通过WebSocket实现服务端向客户端推送消息(无需请求,这就是WebSocket的优势之一)// 客户端解析服务端推送的消息,判断是来单提送还是客户催单,并进行相应的消息提示和语音播报// 前后端约定,服务端发送的数据格式为json,字段包括:type、orderId、content// type为消息类型:1.来单提醒     2.客户催单// orderId为订单id;content为消息内容Map<Object, Object> map = new HashMap<>();map.put("type", WebSocketConstant.NEW_ORDER);map.put("orderId", orders.getId());map.put("content", "订单号:" + outTradeNo);// 通过WebSocket实现来单提醒,向客户端浏览器推送消息webSocketServer.sendToAllClients(JSON.toJSONString(map));}


http://www.ppmy.cn/ops/132701.html

相关文章

vue/react做多语言国际化的时候,在语言配置中不同的语言配置不同的字体,动态引入scss里面

如果想直接在vue文件的css里面使用&#xff0c;就可以使用i18n的t函数&#xff0c;注意t外层也有引号&#xff1a; font-size: v-bind("t(style.teamCurModelFontSize)"); 前提是要引入t函数&#xff1a;

性能调优专题(7)之Innodb底层原理与Mysql日志机制深入剖析

一、MYSQL的内部组件结构 大体来说&#xff0c;Mysql可以分为Server层和存储引擎层两部分。 1.1 Server层 Server层主要包括连接器、查询缓存、词法分析器、优化器等。涵盖MYSQL的大多数核心服务功能&#xff0c;以及所有的内置函数(如日期、时间、数学和加密函数等)&#x…

Webserver(4.4)多进程/多线程实现并发服务器

目录 多进程实现并发服务器多线程实现并发服务器TCP状态转换 多进程实现并发服务器 要实现TCP服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决 一个父进程&#xff0c;多个子进程 父进程负责等待并接受客户端的连接 子进程&#xff1a;完成通信&#xff0c;接收一…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

安全编码实践:反射API的“间谍游戏”

在编程的世界里&#xff0c;反射API就像是一把双刃剑&#xff0c;它既强大又危险。它能让你的代码像007一样灵活多变&#xff0c;但稍不留神&#xff0c;就可能引发安全危机。今天&#xff0c;我们就来聊聊如何在这场“间谍游戏”中&#xff0c;安全地使用反射API进行数据操作。…

JAVA-顺序表ArrayList(实现ArrayList)

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

设计模式-七个基本原则之一-开闭原则 + SpringBoot案例

开闭原则:(SRP) 面向对象七个基本原则之一 对扩展开放&#xff1a;软件实体&#xff08;类、模块、函数等&#xff09;应该能够通过增加新功能来进行扩展。对修改关闭&#xff1a;一旦软件实体被开发完成&#xff0c;就不应该修改它的源代码。 要看实际场景&#xff0c;比如组内…

(自用复习题)常微分方程08

题目来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 书中习题4.1 对应知识 非齐次线性微分方程 3.已知齐次线性微分方程的基本解组 x 1 , x 2 x_1,x_2 x1​,x2​&#xff0c;求下列方程对应的非齐次线性微分方程的通解 三道题都是常数变易法 (1)…