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

WebSocket 库存实时监控实战(Java 服务端 + 前端)

目录一、技术选型二、搭建 Spring Boot 服务端1. 创建项目 引入依赖2. WebSocket 配置类3. 库存实体类库存 预警规则4. WebSocket 服务端核心代码5. 提供接口手动修改库存并推送6. 启动类三、前端页面实时监控 预警提醒四、运行 测试1. 启动 Spring Boot 服务2. 访问前端页面3. 测试功能五、核心功能说明六、生产环境优化建议总结本文用Spring Boot WebSocket实现库存实时推送、缺货 / 超储预警的完整功能包含服务端、前端、库存模拟、预警逻辑代码可直接运行。一、技术选型服务端Spring Boot 3.x WebSocket前端原生 HTML JS无需框架通信WebSocket 长连接功能实时推送库存、缺货预警、超储预警、主动刷新库存二、搭建 Spring Boot 服务端1. 创建项目 引入依赖创建 Spring Boot 项目在pom.xml添加 WebSocket 依赖dependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- WebSocket 核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency /dependencies2. WebSocket 配置类开启 WebSocket 支持import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; Configuration public class WebSocketConfig { /** * 注入 ServerEndpointExporter自动注册 ServerEndpoint 注解的 Bean */ Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }3. 库存实体类库存 预警规则import lombok.AllArgsConstructor; import lombok.Data; import java.math.BigDecimal; Data AllArgsConstructor public class Stock { private String goodsId; // 商品ID private String goodsName; // 商品名称 private Integer stockNum; // 当前库存 private Integer warnStockMin;// 缺货预警阈值 此值报警 private Integer warnStockMax;// 超储预警阈值 此值报警 }4. WebSocket 服务端核心代码实现长连接、推送库存、群发消息、预警逻辑import com.alibaba.fastjson2.JSON; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; /** * WebSocket 服务端 * 连接地址ws://localhost:8080/ws/{客户端ID} */ ServerEndpoint(/ws/{clientId}) Component public class StockWebSocketServer { // 线程安全的集合保存所有 WebSocket 连接 private static final CopyOnWriteArraySetStockWebSocketServer webSocketSet new CopyOnWriteArraySet(); // 与某个客户端的会话需要通过它发送数据 private Session session; // 客户端ID private String clientId; /** * 连接建立成功调用 */ OnOpen public void onOpen(Session session, PathParam(clientId) String clientId) { this.session session; this.clientId clientId; webSocketSet.add(this); System.out.println(新客户端接入 clientId 当前在线人数 webSocketSet.size()); // 连接成功后主动推送一次库存 pushStockInfo(); } /** * 连接关闭调用 */ OnClose public void onClose() { webSocketSet.remove(this); System.out.println(客户端断开 clientId 当前在线人数 webSocketSet.size()); } /** * 收到客户端消息 */ OnMessage public void onMessage(String message, Session session) { System.out.println(收到客户端[ clientId ]消息 message); // 客户端主动请求刷新库存 if (refresh.equals(message)) { pushStockInfo(); } } /** * 发生错误 */ OnError public void onError(Session session, Throwable error) { System.out.println(WebSocket 发生错误); error.printStackTrace(); } /** * 服务端推送消息给当前客户端 */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } // 库存推送核心方法 public void pushStockInfo() { try { // 1. 模拟真实库存数据实际项目从数据库/Redis读取 Stock stock new Stock( GOODS001, 华为Mate70, (int) (Math.random() * 150), // 随机库存 0~150 20, // 低于20缺货预警 100 // 高于100超储预警 ); // 2. 预警判断 String warnMsg ; if (stock.getStockNum() stock.getWarnStockMin()) { warnMsg 【缺货预警】商品 stock.getGoodsName() 库存不足当前库存 stock.getStockNum(); } else if (stock.getStockNum() stock.getWarnStockMax()) { warnMsg 【超储预警】商品 stock.getGoodsName() 库存过多当前库存 stock.getStockNum(); } // 3. 封装推送消息 PushMessage pushMessage new PushMessage(stock, warnMsg); String json JSON.toJSONString(pushMessage); // 4. 推送给当前客户端 sendMessage(json); System.out.println(推送库存给[ clientId ] json); } catch (Exception e) { e.printStackTrace(); } } /** * 统一推送库存给所有客户端外部调用比如库存修改后触发 */ public static void pushAllStock() { for (StockWebSocketServer webSocket : webSocketSet) { webSocket.pushStockInfo(); } } // 推送消息结构 Data AllArgsConstructor static class PushMessage { private Stock stock; // 库存数据 private String warnMsg; // 预警消息为空正常 } }5. 提供接口手动修改库存并推送模拟业务系统修改库存后主动触发全量推送import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/stock) public class StockController { /** * 手动刷新库存并推送给所有前端 * 访问http://localhost:8080/stock/push */ GetMapping(/push) public String pushStock() { StockWebSocketServer.pushAllStock(); return 库存已刷新并推送给所有前端; } }6. 启动类import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class WebSocketStockApplication { public static void main(String[] args) { SpringApplication.run(WebSocketStockApplication.class, args); } }三、前端页面实时监控 预警提醒创建index.html直接放在resources/static目录下!DOCTYPE html html langzh-CN head meta charsetUTF-8 title库存实时监控系统/title style body { text-align: center; margin-top: 50px; } .stock-box { font-size: 22px; margin: 20px; padding: 15px; border: 1px solid #ccc; } .warn { color: red; font-weight: bold; font-size: 24px; } .normal { color: green; font-size: 22px; } #refreshBtn { padding: 10px 20px; font-size: 16px; cursor: pointer; } /style /head body h1库存实时监控/h1 div idstockInfo classstock-box normal等待连接.../div button idrefreshBtn手动刷新库存/button script let ws; const clientId client_ new Date().getTime(); // 唯一客户端ID const stockInfo document.getElementById(stockInfo); const refreshBtn document.getElementById(refreshBtn); // 连接 WebSocket function connect() { // ws:// 协议 服务端地址 ws new WebSocket(ws://localhost:8080/ws/ clientId); // 连接成功 ws.onopen function () { stockInfo.innerText WebSocket 连接成功正在监控库存...; stockInfo.className stock-box normal; }; // 收到服务端推送的库存数据 ws.onmessage function (event) { const data JSON.parse(event.data); showStock(data); }; // 连接关闭 ws.onclose function () { stockInfo.innerText 连接断开正在重连...; stockInfo.className stock-box warn; setTimeout(connect, 2000); // 自动重连 }; // 连接错误 ws.onerror function () { stockInfo.innerText 连接异常; stockInfo.className stock-box warn; }; } // 显示库存 预警 function showStock(data) { const stock data.stock; const warnMsg data.warnMsg; if (warnMsg) { // 缺货/超储预警 stockInfo.innerText warnMsg; stockInfo.className stock-box warn; // 弹出浏览器提醒需要授权 new Notification(库存预警, { body: warnMsg }); } else { // 库存正常 stockInfo.innerText 商品 stock.goodsName \n 库存 stock.stockNum \n 缺货阈值 stock.warnStockMin 超储阈值 stock.warnStockMax; stockInfo.className stock-box normal; } } // 手动刷新库存 refreshBtn.onclick function () { if (ws.readyState 1) { ws.send(refresh); } else { alert(连接未建立无法刷新); } }; // 启动连接 connect(); /script /body /html四、运行 测试1. 启动 Spring Boot 服务2. 访问前端页面打开浏览器访问http://localhost:8080/index.html3. 测试功能自动推送页面加载后自动获取库存实时预警库存 20 → 缺货预警红色提醒 浏览器通知库存 100 → 超储预警20~100 → 正常绿色手动刷新点击按钮立即拉取最新库存全量推送浏览器访问http://localhost:8080/stock/push所有打开的页面都会实时收到新库存五、核心功能说明长连接WebSocket 一次连接永久通信比轮询更高效实时推送服务端主动推送库存前端无需刷新预警机制服务端判断缺货 / 超储实时推送给前端自动重连前端断开后自动重连保证监控稳定集群兼容可对接 Redis 发布订阅实现多服务端推送六、生产环境优化建议库存数据从MySQL/Redis读取不要用随机数加入心跳检测防止假连接预警消息存入数据库方便查询历史预警对接短信 / 企业微信 / 钉钉预警通知集群部署时用Redis WebSocket广播消息总结这套代码是可直接运行的完整实战项目包含服务端 前端 预警逻辑核心是StockWebSocketServer实现连接管理、库存推送、预警判断前端自动重连 实时展示 桌面提醒体验接近生产系统可以直接扩展商品列表、历史记录、多仓库监控等功能

相关文章:

WebSocket 库存实时监控实战(Java 服务端 + 前端)

目录 一、技术选型 二、搭建 Spring Boot 服务端 1. 创建项目 & 引入依赖 2. WebSocket 配置类 3. 库存实体类(库存 预警规则) 4. WebSocket 服务端核心代码 5. 提供接口:手动修改库存并推送 6. 启动类 三、前端页面&#xff0…...

别再问客服了!手把手教你用VNC在AutoDL GPU服务器上跑起你的第一个GUI程序

云端GPU服务器VNC实战:从零部署GUI开发环境全指南 租用云GPU服务器进行深度学习训练已成为算法工程师的常态,但当代码涉及图形界面时,许多开发者会在cv2.imshow()或PyQt窗口弹出的环节卡壳。本文将基于AutoDL平台,详解如何通过Tur…...

C++学习笔记17:析构函数

目录 一、什么是析构函数? 二、析构函数写法 三、析构函数的特点 四、析构函数什么时候调用? 五、析构函数不是销毁对象本身 六、为什么需要析构函数? 七、用析构函数释放动态内存 八、析构函数的调用顺序 九、析构函数和构造函数的…...

不止于解题:聊聊猪圈密码、圣堂武士密码和标准银河字母背后的历史与趣闻

不止于解题:猪圈密码、圣堂武士密码与标准银河字母的文化考古 当你在CTF竞赛中第一次遇到那些神秘的几何符号时,是否曾好奇过这些图形背后的故事?从共济会的秘密集会到《我的世界》游戏中的彩蛋,图形密码早已超越了单纯的加密工具…...

RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼

RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a…...

AI Agent到底是什么

AI Agent 到底是什么?看完我悟了 今天看了几个产品,跟 AI 聊了聊,突然对 AI Agent 有了个很朴素的理解。AI Agent 不神秘 很多人觉得 AI Agent 是什么高深的东西,只有大厂才能搞。 但我现在的理解就一句话:❝ 「AI Age…...

告别手动填表!用Python脚本5分钟搞定DSSAT模型批量模拟(附源码)

Python自动化DSSAT模型:从Excel到批量模拟的高效科研实践 在农业科研和气候情景分析中,DSSAT模型作为全球主流的作物生长模拟工具,其价值早已被广泛认可。但真正使用过它的研究者都深有体会:当面对数十种管理方案、上百个气象场景…...

集成测试实战

软件测试理论:https://blog.csdn.net/2402_88266590/article/details/160966638?spm1011.2415.3001.5331 单元测试实战:https://blog.csdn.net/2402_88266590/article/details/161017518?spm1001.2014.3001.5502 下面就开始进入集成测试的学习吧&…...

从“让大模型回答问题“到智能决策:LangGraph 构建 AI Agent 的核心奥秘

本文深入解析了 AI Agent 的核心价值在于判断与决策,而非简单回答问题。LangGraph 作为图式工作流框架,通过 State(共享状态)、Node(处理节点)、Router(决策分支)的设计,…...

Android Studio中文界面汉化教程:3步实现母语开发环境

Android Studio中文界面汉化教程:3步实现母语开发环境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Android …...

在Hermes Agent中自定义Provider接入Taotoken服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Hermes Agent中自定义Provider接入Taotoken服务 对于使用Hermes Agent进行AI应用开发的团队而言,能够灵活接入不同的…...

工业控制新方案:电容HMI与字符LCD组合应用实战

1. 项目概述:当经典LCD遇上电容触控,工业控制的新解法最近在做一个产线设备升级的项目,客户对操作界面的要求突然拔高了不少:既要能看清复杂的工艺参数,又要求操作像手机一样流畅,还得扛得住车间里的油污、…...

Flowframes:AI视频插帧工具让你的视频流畅度翻倍

Flowframes:AI视频插帧工具让你的视频流畅度翻倍 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframes 你是否曾因视频卡顿而烦恼&…...

基于ARM核心板的T-BOX系统设计:从硬件选型到软件实现

1. 项目概述与核心价值最近几年,车联网的概念已经从实验室和展会,实实在在地走进了我们的日常生活。作为一名在嵌入式领域摸爬滚打了十几年的工程师,我亲眼见证了从简单的GPS定位模块,到如今功能高度集成的车载T-BOX(T…...

2026 论文双检突围:9 款查重降重降 AIGC 工具硬核横评,Paperxie 领跑全场景通关

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 毕业季论文查重飘红、AIGC 率爆表,已成为无数本科生与研究生的 “双重噩梦”。2026 年知网、维普全面升级…...

手把手教你搞定Windows下的NAMD和VMD安装(附最新版下载与注册避坑指南)

Windows平台NAMD与VMD安装全攻略:从零开始玩转分子动力学模拟 当第一次接触分子动力学模拟时,软件安装往往是新手面临的第一个挑战。NAMD和VMD作为该领域最常用的工具组合,它们的安装过程看似简单,实则暗藏诸多细节。本文将带你从…...

怎么将5v电升到12v?

开关电源BOOST升压原理首先,12v降到5v,我们可以通过串联一个电阻或者电感,利用串联分压定理,就能实现。那如何把5v升到12v呢?交流电我们可以通过变压器实现。那直流电呢?(开关电源BOOST升压原理…...

从查重到降 AIGC,2026 年 9 款论文工具横评:Paperxie 领衔,谁才是本科生的 “熬夜救星”?

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 每到毕业季,论文查重飘红、AIGC 检测亮红灯,几乎是所有本科生的共同噩梦。从初稿到定稿&#…...

从老式万用表到精密测量:双积分ADC如何用‘慢’换来‘准’?选型避坑指南

从老式万用表到精密测量:双积分ADC如何用‘慢’换来‘准’?选型避坑指南 在仪器仪表和传感器信号调理领域,精度与速度的权衡一直是硬件工程师面临的核心挑战。当我们处理温度、压力或称重传感器等低频高精度信号时,传统的SAR和Σ…...

【例题2】The XOR Largest Pair(信息学奥赛一本通- P1472)

【题目描述】在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?【输入】第一行一个整数 N。第二行 N 个整数 Ai​​ 。【输出】一个整数表示答案。【输入样例】5 2 9 5 7 0【输出样例】14【提示】对于 100% 的数据&#xff0…...

3分钟解锁Translumo:Windows平台屏幕实时翻译的终极解决方案

3分钟解锁Translumo:Windows平台屏幕实时翻译的终极解决方案 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还…...

CVAT教程

ubuntu服务器部署 https://blog.csdn.net/qq_48187848/article/details/146040443?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-1-146040443-blog-145734432.235%5Ev43%5Epc_blog_bottom…...

视觉伺服visual servoing

模拟视觉反馈(图像 X/Y 偏差)自动控制机械臂末端向目标移动闭环控制,偏差越小速度越低无硬件相机也能运行(内置虚拟视觉信号)视觉伺服 Visual Servoing 示例代码cpp运行/********************************************…...

20+终极Obsidian模板:简单快速构建你的卡片盒笔记系统

20终极Obsidian模板:简单快速构建你的卡片盒笔记系统 【免费下载链接】Obsidian-Templates A repository containing templates and scripts for #Obsidian to support the #Zettelkasten method for note-taking. 项目地址: https://gitcode.com/gh_mirrors/ob/O…...

Beyond Compare 5密钥生成终极指南:从激活失败到完全使用

Beyond Compare 5密钥生成终极指南:从激活失败到完全使用 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否也遇到过Beyond Compare 5弹出"评估模式错误"的困扰&#…...

告别Unity WebGL的模糊UI:用Vue3重构前端界面,手把手教你实现双向通信

Unity WebGL与Vue3的完美联姻:打造高清交互界面的实战指南 1. 为什么需要重构Unity WebGL的UI系统? 许多Unity开发者都曾经历过这样的困境:当我们将精心制作的3D项目发布为WebGL版本时,原生UGUI在浏览器中的表现往往不尽如人意。模…...

零基础转专业计算机机试,我用这5道题帮你摸清浙工大出题套路(附C++代码)

零基础转专业计算机机试:5道真题破解浙工大出题密码(附C实战代码) 第一次面对计算机转专业机试时,我盯着屏幕上闪烁的光标,手指悬在键盘上方却不知从何下手。那种面对陌生题型的茫然感,至今记忆犹新。现在作…...

麒麟KylinOS 2303系统管理员必备:用模板为新用户批量配置统一电源策略

麒麟KylinOS 2303系统管理员实战:批量配置用户电源策略的模板化方案 在企业办公环境或学校机房中,麒麟KylinOS系统管理员经常面临统一管理多台电脑电源策略的需求。传统逐台配置的方式效率低下,而通过/etc/skel/用户模板目录的机制&#xff0…...

保姆级教程:用STM32F103C8T6和MAX485芯片实现稳定的一主多从RS485通讯(附完整代码)

STM32F103C8T6与MAX485构建工业级RS485总线系统实战指南 在工业自动化领域,稳定可靠的通信系统如同神经脉络般重要。想象一下,当您需要在一个大型温室中部署数十个温湿度传感器,或者在一个工厂车间监控多台设备的运行状态时,点对点…...

面试必问:AI 医疗平台怎么设计?这次彻底讲透

AI 医疗平台怎么设计?一次讲清医生辅助、知识库、问答系统与安全边界 大家好,我是一名有 4 年工作经验的 Java 后端开发。 AI 和医疗结合这个方向这两年非常热,但也正因为它太敏感,所以最怕两种极端:一种是把它吹成“万…...