基于SpingBoot+WebSocket实现前后端与数据库的数据同步

WebSocket之socket.io的基本使用 使用WebSocket可以实现非常多有趣又实用的功能,后面再写一个在线聊天室巩固一下知识。推荐阅读【微信小程序&uniapp系列文章】【Vue实用插件及技巧系列文章】 阅读详情
AI摘要

本文介绍了如何利用SpringBoot、MyBatisPlus和WebSocket技术栈,结合Mysql数据库和原生微信小程序,实现系统对订单的实时查询和状态更新。通过WebSocket确保数据一致性,并借助SpringBoot的定时任务轮询数据库,保持后端与数据库同步。

技术选型

后端:SpringBoot+MyBatisplus+WebSocket
数据库:Mysql
前端:原生微信小程序

实现思路

系统需要对数据库中的订单进行实时查询,更新状态。因此使用WebSocket保证前后端数据一致性,再通过SpringBoot的定时任务轮询数据库,实现后端与数据库的数据一致性。

实现步骤

1、导入websocket依赖,直接复制到pom.xml

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2、编写WebSocket配置类,直接复制

@Configuration
public class WebSocketConfig {
    /**
     * 	注入ServerEndpointExporter,
     * 	这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

3、编写SessionPool工具类实现消息发送,这个可以根据需求自己改写

public class SessionPool {
    //key-value : userId - 会话(系统创建)
    public static Map<String, Session> sessions = new ConcurrentHashMap<>();//避免多线程问题

    public static void close(String sessionId) {
        //sessionId是在session中添加了一个标识,准确定位某条session
        for (String userId : sessions.keySet()) {
            Session session = sessions.get(userId);
            if (session.getId().equals(sessionId)) {
                sessions.remove(userId);
                break;
            }
        }
    }

    public static void sendMessage(String userId, String message) {
        sessions.get(userId).getAsyncRemote().sendText(message);
    }


    //消息的群发,业务逻辑的群发
    public static void sendMessage(String message) {
        for (String sessionId : sessions.keySet()) {
            sessions.get(sessionId).getAsyncRemote().sendText(message);
        }
    }

    //点对点的消息推送
    public static void sendMessage(Map<String, Object> params) {
        String userId = params.get("formUserId").toString();
        String toUserId = params.get("toUserId").toString();
        String msg = params.get("message").toString();
        //获取用户session
        Session session = sessions.get(toUserId);

        //session不为空的情况下进行点对点推送
        if (session != null) {
            session.getAsyncRemote().sendText(msg);
        }
    }
}

4、编写Controller类
先加上注解

@ServerEndpoint("/websocket/{userId}")
@EnableScheduling //开启定时任务
@RestController
@RequestMapping("/api/xxx")
public class xxController{

由该注解可得请求路径为:“ws://localhost:8080/websocket/用户id”
编写业务,里面用到了hutool

//连接建立成功调用的方法,如果需要ws建立时推送消息可写
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        //把session加入连接池
        SessionPool.sessions.put(userId, session);
         //调用service层查询实时数据
        YourData newData=xxService.xx();
        //将数据转换为json发送到前端
        String json= JSONUtil.toJsonStr(newData);
        SessionPool.sendMessage(json);
        log.info("Json:{}",json);
        log.info("建立连接成功,id:"+userId);
    }
    //关闭会话的时候调用,如果需要ws断连时推送消息可写
    @OnClose
    public void onClose(Session session) throws IOException {
        SessionPool.close(session.getId());
        log.info("断开连接成功,id:"+session.getId());
        session.close();
    }

    //接收到客户端的消息后调用
    @OnMessage
    public void onMessage(String message, Session session) {
        //接收客户端数据,更新数据库
        xxxxxxxxx;
    }

接下来在Controller中定时调用Service的方法获取数据库中的数据,通过ws推送到前端
@Scheduled(fixedDelay = 1000) 定时任务,一秒执行一次

    
    //    定时任务,每秒查询一次数据库,将数据通过ws推送到前端
    @Scheduled(fixedDelay = 1000)
    public void pollDatabaseForNewData() {
        //调用service层查询实时数据
        YourData newData=xxService.xx();
        //将数据转换为json发送到前端
        String json= JSONUtil.toJsonStr(newData);
        SessionPool.sendMessage(json);
    }

5、前端建立websocket连接,以小程序为例
js代码:

openSocket() {
    try {
      console.log("建立websocket连接...")
      // 连接后台服务器
      // 用户id
      var id="xxxxxxxxxxxxx";
      this.SocketTask = wx.connectSocket({
        url: `ws://127.0.0.1:8080//websocket/${id}`,
        success: (res) => {
          console.log("连接成功!,res:", res)
        }
      })
    } catch (e) {
      console.log(e)
    }
    //连接成功后的操作
    this.SocketTask.onOpen(() => {
      console.log('WebSocket 已连接')
    })
    //断开后台服务器的操作
    this.SocketTask.onClose(() => {
      console.log('WebSocket 已断开')
      // this.ReConnect()
    })
    //报错时执行
    this.SocketTask.onError(error => {
      // this.ReConnect()
    })
    // 监听服务器推送的消息
    this.SocketTask.onMessage(message => {
      // 将json数据转换为对象
      var obj = JSON.parse(message.data)
      //数据处理业务
      xxxxxx;
    })
  },
  // 关闭websocket服务
  closeSocket() {
      this.SocketTask.close({
        success: () => {
          console.log("断开连接");
        }
      })
  },

前端也可以使用vue等等,需要自己去找websocket相关接口,后端是通用的。

自学 websocket(七):实战上手 实现应用状态同步 这里收到的消息是固定格式的,用了json格式,值代表了用户端那边对计数器的加减操作,客户端操作由。同样,会一点python就行,网页代码会不会写不重要,copy运行看效果就ok。老规矩,先上代码再解析,功能越来越酷了,从第一篇实战一步步学习效果更好哦。保持应用的状态同步,每个独立client都能修改状态。并用了if来判断加减,并分别执行加减操作和广播。在这次写的server中,处理函数。和最开始的实战讲的一样,使用了。两个任务,不像上一篇是分开的。来保证不停的循环着接收消息。先说一下实现了的效果。 阅读详情

相关推荐

WebSocket实现后端数据变化,通知前端实时更新数据

数据实时更新,WebSocket通信,数据变化。

余鱼瑜渔的博客 2万+

两种方式实现websocket获取数据库查询进度

本文实现了两种方式用websocket连接实现前端通过API获取数据库查询进度,作为websocket初步学习的参考。

Moelimoe的博客 2641

企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干

一 功能描述: pc选择商品后生成二维码,用户微信扫码直接支付 备注:红色为后台给前端的接口 1.前端 选择确认商品 2.调后台生成订单接口 (状态未付款) 3.返回订单的详情(订单确认页面 参数:订单号,金额等) 4.调后台接口生成支付的二维码获取二维码接口(如果后台配了通信,则前端带上订单号连上后台websocket,做为支付成功后通知前端。...

m0_37946870的博客 619

使用WebSocket解决页面数据实时同步

功能: 一个页面需要在不同的PC端访问,在某一PC端对网页内容发生改变时,其他PC端页面数据实时更新显示. 实现: 采用webSocket+AOP通知的方式实现 思路: 当页面数据修改时,会通过后端保存方法存进数据库,这样我们就要一个入口,当数据保存方法被调用执行完后(AOP后置通知),触发webSocket消息机制,向前端发送更新提示,前端调用更新方法进行页面更新. 实现过程: 在...

qq826776005的博客 1万+

Zynq AXI DMA实战:5分钟搞懂S_AXIS_S2MM和M_AXIS_MM2S数据流(附Vivado配置截图)

本文通过Vivado实战配置,清晰解析了Zynq平台AXI DMA IP核中S_AXIS_S2MM和M_AXIS_MM2S数据流的核心概念与连接方法。文章重点阐述了数据流向、主从关系及接口命名规则,并提供了从ADC数据采集到DDR存储,再从DDR读取数据发送至DAC的完整双向数据流搭建指南,帮助工程师快速避坑。

weixin_29200741的博客 450

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

基于pytorch cnn ResNets卷积网络的模糊图像检测 完整代码数据直接运行

730

WebSocket + SpingBoot实现扫码登录

一、首先咱们需要一张表 User_Token表 字段如下: uuid : 用于确保唯一性 userId :谁登录的 loginTime :登录时间 createTime :创建时间 用于判断是否过期 state:是否二维码失效 0有效 1失效 二、角色都有哪些 android端 or 微信Web端 :扫码 PC端 :被扫。登录 服务端:掌控全局,提供接口 三、接口都需要哪些 生成二维码接口:生成一个二维码。二维码中有UUID 确认身份接口:确定身份以及判断是否二维码过期等 四、步骤 PC端打开

zouyang920的博客 651

HQChart实战教程49-点击修改K线颜色及背景色

HQChart实战教程49-点击修改K线颜色及背景色需求效果图步骤1. 注册点击监听事件2. 修改K颜色添加一个自定义颜色的K线klineoption清空所有自定义颜色的K线option交流QQ群: 950092318HQChart代码地址完整例子 需求 对点击的K线修改颜色。 效果图 步骤 1. 注册点击监听事件 事件ID JSCHART_EVENT_ID.ON_CLICK_CHART_PAINT, 注册监听事件见教程 HQChart使用教程5- K线图控件操作函数说明 this.Create=func

小银 2911

WebSocket 的故事(四)—— Spingboot 中,如何利用 WebSocket 和 STOMP 快速构建点对点的消息模式(2)

概述 本文是WebSocket的故事系列第三篇第二节,将针对上篇的代码介绍,给出一个STOMP实现点对点消息的简单例子。WebSocket的故事系列计划分六大篇,旨在由浅入深的介绍WebSocket以及在Springboot中如何快速构建和使用WebSocket提供的能力。 本系列计划包含如下几篇文章: 第一篇,什么是WebSocket以及它的用途第二篇,Spring中如何利用STOMP快速构建WebSocket广播式消息模式第三篇,Springboot中,如何利用WebSocket和STOMP快速构

smilehappiness的博客 765

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math #开始时间,用于初始化一些参数 def OnStart(context) : print "I\'m starting..." #设置全局变量 g.signalcount = 0 g.signal_list = [] g.buysignal = 0 .

qq_26742269的博客 1284

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

基于spingboot的websocket订阅、广播、多人聊天室示例

基于spingboot的websocket多人聊天系统。包括订阅,广播、点对点单人聊天,多人聊天室功能。

神尐破 769

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

视觉人机器视觉的博客 1480

基于springBoot 实现webSocket方式的扫码登录

https://blog.youkuaiyun.com/q826qq1878/article/details/91041679最近单位又有一个新 Java 项目。涉及到扫码登录。之前项目使用的是 aj...

程序员闪充宝 204

3步!Spring Boot+OCR引擎秒提身份证/营业执照?手把手教你从零实现!

OCR技术革新文档识别效率 本文演示了如何利用Spring Boot+Tesseract OCR+OpenCV构建自动化文档识别系统。相比传统人工录入,OCR技术可实现: 5秒极速提取身份证/营业执照关键信息 精准识别中文文本(准确率90%+) 正则过滤自动匹配结构化数据 技术要点: OpenCV图像预处理(灰度化+二值化) Tesseract多语言OCR识别 正则表达式精准提取证件号码 效率提升达100倍,错误率降低90%,适用于金融、政务等需要批量处理证件的场景。

java专栏 903

Imagenet数据集1000类别中英文

英文 {0: 'tench, Tinca tinca', 1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 3: 'tiger shark, Galeocerdo cuvieri', 4: 'hammerhead, hammerhead shark', 5: 'electric ray, cram.

识物专栏 1800

SpingBoot使用webSocket(二)---给指定人发消息

本案例将session的id模拟为用户id,将session保存到ConcurrentHashMap中,用来获取到指定人的session,并向其发送消息。 存在的问题:当有人关闭或者刷新浏览器,原来的session就相当于失效了,此时再向其发送消息就会引起异常。原因是ConcurrentHashMap存的session没有被及时清除。 一、引入依赖 <dependency> <groupId>org.springframework.boot</groupI.

chenguixu的博客 706

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SpringBoot集成WebSocket,实现后台向前端推送信息

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~中...

芋艿V 841

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringBoot快速搭建WebSocket

目录 前言 pom的依赖 编写WebSocketConfig配置类 编写WebSocketServerController配置类 前端初始化查询用户创建数 测试 项目目录结构 前言 前段时间公司做一个代办收件功能,后来要求在菜单右上角显示有多少笔代办件,由于时间充忙就直接查询数据库了,没有实时想前端推送新增的办件。所以在休息的时候来做这件事,你本文写的demo是查询当...

liangshitian的博客 2万+

基于SpringBoot与微信小程序的大学生餐厅点餐系统设计与实现

摘要:基于SpringBoot与微信小程序的高校餐厅点餐系统,旨在解决传统窗口点餐效率低、排队拥堵问题。系统实现线上点餐、支付、取餐验证全流程数字化,平均等待时间缩短至5分钟内。采用前后端分离架构,后端使用SpringBoot+MySQL+Redis,前端为微信小程序,支持高并发处理。经测试,系统在1000用户同时点餐时响应时间稳定在1秒内。未来可拓展校园卡支付、AI推荐及周边商户服务,推动校园餐饮数字化升级。(149字)

weixin-80213251的博客 346

spingboot茶馆座位预约茶文化推广宣传系统vue3

后端采用Spring Boot框架,提供RESTful API接口,处理业务逻辑和数据存储。前端使用Vue 3组合式API开发,搭配Element Plus或Ant Design Vue组件库实现交互界面。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。注意:实际开发需根据团队技术能力调整技术方案,初期建议采用Monolithic架构快速迭代验证商业模式。查看详细的视频演示,或者了解其他版本的信息。数据库 mysql 版本不限。

bishe288的博客 223

基于springboot框架公司员工食堂在线点餐餐饮餐桌预约管理系统的设计与实现-idea maven vue

对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。需要成品或者定制,如果本展示有不满意之处。员工模块:注册/登录、个人信息管理、菜单浏览、在线点餐、订单查询、餐桌预约。管理模块:员工管理、菜品管理、订单管理、餐桌管理、数据统计与分析。订单表:订单ID、员工ID、菜品列表、总金额、支付状态、下单时间。预约记录表:记录ID、员工ID、餐桌ID、预约时段、使用状态。实现页面逻辑:登录页、菜单列表页、订单提交页、预约日历页等。

abo2022的博客 407

【大学生期末Java项目】springboot+vue+mysql实现快递公司物流管理项目【原创】

非常适合大学生的大学生期末项目spingboot+vue3+mysql实现快递流程项目

潜意识Java的博客 9562

SpringBoot与微信小程序结合的刷题系统开发实践

在现代教育技术领域,前后端分离架构已成为提升开发效率的主流方案。通过SpringBoot框架的自动配置和RESTful接口设计,开发者能快速构建高性能后端服务,而微信小程序凭借即用即走的特性,完美适配移动端碎片化学习场景。这种技术组合不仅解决了传统PC端系统打开率低的问题,还克服了移动H5应用登录繁琐的痛点。从技术实现角度看,利用Spring Data JPA进行动态查询,配合微信小程序的本地缓存和订阅消息能力,可显著提升用户体验。特别是在K12教育场景中,数据显示该架构能使学员每日刷题时长提升37%,题目

weixin_33913332的博客 716

vue和springboot实现网页聊天_SpringBoot + Vue + Electron 开发 QQ 版聊天工具

公众号:不安分的猿人一、简介这是一款基于 JS 实现的超轻量级桌面版聊天软件。主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。也支持web网页聊天实现。文字聊天,互传文件,离线消息,群聊,断线重连等功能。动图竟然无发上传,可以看原文:qq版聊天工具二、本地搭建2.1 技术栈后端技术栈: - springboot: 让开发人员快速开发的一款Java的微服务框架...

weixin_39625975的博客 337

基于springboot的在线考试管理系统设计实现

传统纸质考试模式存在组织成本高、阅卷效率低、数据统计困难等问题,尤其在远程教育和疫情期间更凸显局限性。系统实现自动组卷、在线监考、智能阅卷功能,将传统考试流程从3-5天缩短至1小时内完成,降低90%以上的人工批改工作量。DTO实现前后端数据解耦,全局异常处理器统一捕获异常。试题管理支持多种题型(单选、多选、判断)的CRUD操作,支持Excel批量导入。微服务化部署时可拆分为用户服务、考试服务和报表服务,通过Spring Cloud Gateway实现API聚合,Nacos作为注册中心保证服务发现。

2501_93250029的博客 1000
上一篇: java封装Des3Utils类实现CBC加密、解密
下一篇: 基于自定义注解实现无需校验权限访问接口
PafferR
博客等级 码龄7年 15粉丝 6原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值