如何在Spring Boot中实现实时通知

如何在Spring Boot中实现实时通知

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将讨论如何在Spring Boot应用中实现实时通知功能,这在现代Web应用程序和服务中是非常重要的一部分。

一、什么是实时通知?

实时通知是指系统能够即时将特定信息或事件推送给用户或其他系统的能力。与传统的轮询或定时拉取相比,实时通知能够实现更低的延迟和更高的实时性,为用户提供更好的交互体验。

二、实现实时通知的技术选择

在Spring Boot中,我们可以选择多种技术来实现实时通知,包括但不限于:

  1. WebSocket:提供了双向通信的能力,适用于需要低延迟、高实时性的场景。
  2. Server-Sent Events (SSE):允许服务器端向客户端单向推送数据,适用于单向通信场景。
  3. 消息队列:如RabbitMQ、Kafka等,用于异步消息传递和广播通知。
  4. Webhooks:通过HTTP回调实现事件通知,适用于接收外部系统的事件推送。

本文将重点介绍WebSocket和SSE的实现方式。

三、使用WebSocket实现实时通知

WebSocket是一种先进的通信协议,允许在单个TCP连接上进行全双工通信。在Spring Boot中,我们可以通过Spring WebSocket模块实现WebSocket功能。

1. 添加依赖

首先,在pom.xml中添加Spring WebSocket的依赖:

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

2. 创建WebSocket配置类

package cn.juwatech.config;import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic"); // Enable a simple in-memory message broker to carry messages back to the client on destinations prefixed with "/topic"config.setApplicationDestinationPrefixes("/app"); // Message-handling methods (message-handling methods) are mapped to the /app prefix}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/ws").withSockJS(); // Use SockJS to enable fallback options for browsers that don’t support websocket}
}

3. 编写控制器

package cn.juwatech.controller;import cn.juwatech.dto.Notification;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;@Controller
public class NotificationController {@MessageMapping("/sendNotification")@SendTo("/topic/notification")public Notification sendNotification(Notification notification) {return notification;}
}

4. 编写前端页面(HTML + JavaScript)

<!DOCTYPE html>
<html>
<head><title>Real-time Notifications</title><script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.0/sockjs.min.js"></script><script>var stompClient = null;function connect() {var socket = new SockJS('/ws');stompClient = Stomp.over(socket);stompClient.connect({}, function(frame) {console.log('Connected: ' + frame);stompClient.subscribe('/topic/notification', function(notification) {showNotification(JSON.parse(notification.body).message);});});}function showNotification(message) {var notificationsDiv = document.getElementById('notifications');var p = document.createElement('p');p.textContent = message;notificationsDiv.appendChild(p);}window.onload = function() {connect();};</script>
</head>
<body><h2>Real-time Notifications</h2><div id="notifications"></div>
</body>
</html>

四、使用Server-Sent Events (SSE)实现实时通知

Server-Sent Events (SSE)允许服务器端向客户端单向推送数据,适合于需要向客户端发送更新或通知的场景。

1. 创建SSE控制器

package cn.juwatech.controller;import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@RestController
public class SSEController {private final ExecutorService nonBlockingService = Executors.newCachedThreadPool();@GetMapping(value = "/sse/notification", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter serverSentEvents() {SseEmitter emitter = new SseEmitter();nonBlockingService.execute(() -> {try {emitter.send(SseEmitter.event().name("notification").data("New notification"));// Simulate sending notifications periodicallyThread.sleep(3000);emitter.send(SseEmitter.event().name("notification").data("Another notification"));emitter.complete();} catch (Exception e) {emitter.completeWithError(e);}});return emitter;}
}

2. 前端页面

<!DOCTYPE html>
<html>
<head><title>Server-Sent Events (SSE) Notifications</title>
</head>
<body><h2>Server-Sent Events (SSE) Notifications</h2><div id="notifications"></div><script>var notificationsDiv = document.getElementById('notifications');var eventSource = new EventSource('/sse/notification');eventSource.onmessage = function(event) {var message = event.data;var p = document.createElement('p');p.textContent = message;notificationsDiv.appendChild(p);};eventSource.onerror = function(event) {console.error('EventSource error: ', event);eventSource.close();};</script>
</body>
</html>

五、总结

通过本文,我们详细介绍了在Spring Boot应用中实现实时通知的两种主要方式:WebSocket和Server-Sent Events (SSE)。WebSocket适合双向通信和复杂的应用场景,而SSE适合单向通知和简单的推送场景。我们通过具体的代码示例演示了如何在Spring Boot中配置和使用这些技术,以及如何在前端页面接收和展示实时通知。希望本文对你理解和实现实时通知功能有所帮助!

微赚淘客系统3.0小编出品,必属精品!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的awt和swing的区别

AWT&#xff08;Abstract Window Toolkit&#xff09;和Swing都是Java中用于创建图形用户界面&#xff08;GUI&#xff09;的工具包&#xff0c;但它们之间存在一些关键的区别。下面我将通过具体的例子来说明这些区别&#xff1a; 1. 跨平台性能 AWT&#xff1a; AWT是基于本…

实验六 图像的傅立叶变换

一&#xff0e;实验目的 1了解图像变换的意义和手段&#xff1b; 2熟悉傅立叶变换的基本性质&#xff1b; 3熟练掌握FFT变换方法及应用&#xff1b; 4通过实验了解二维频谱的分布特点&#xff1b; 5通过本实验掌握利用MATLAB编程实现数字图像的傅立叶变换。 6评价人眼对图…

LeetCode 每日一题 2024/7/1-2024/7/7

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 7/1 2065. 最大化一张图中的路径价值7/2 3115. 质数的最大距离7/3 3099. 哈沙德数7/4 3086. 拾起 K 个 1 需要的最少行动次数7/5 3033. 修改矩阵7/6 3101. 交替子数组计数7…

第一周周日总结

题目总结 1.给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时…

C# MathNet

Vector使用 Build.Dense 创建列向量:列向量转行向量&#xff08;行矩阵&#xff09;:使用 DenseOfArray 方法:使用 PointwiseMultiply 进行向量元素级乘法:计算向量的点积&#xff08;内积&#xff09;&#xff1a;访问向量的特定元素&#xff1a;遍历向量中的所有元素&#xf…

公众号文章阅读20w+?你猜腾讯给了我多少钱?

前两天写的一篇文章&#xff0c; 《1000T的文件怎么能快速从南京传到北京&#xff1f;最佳方案你肯定想不到》 一不小心被平台推荐&#xff0c;阅读量居然达到了20w&#xff08;这篇收益在文章底部&#xff01;&#xff09;。 留言也是相当精彩 说来惭愧&#xff0c;这篇文章我…

【74LS163做24进制计数器】2021-11-19

缘由用74LS163做24进制计数器-其他-CSDN问答,仿真multisim两个74LS163芯片如何构成47进制计数器-吐槽问答-CSDN问答 参考74ls163中文资料汇总&#xff08;74ls163引脚图及功能_内部结构图及应用电路&#xff09; - 电子发烧友网

苍穹外卖 ...待更新

苍穹外卖 1、 阿里云OSS2、菜品分类查询 1、 阿里云OSS 工具类 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import lombok.AllArgsConstructor…

深入理解Qt智能指针

目录 1.引言 2.共享数据 2.1.特点 2.2.QSharedData 2.3.隐式共享 2.4.显示共享 3.共享指针 3.1.QSharedPointer 3.2.QWeakPointer 4.范围指针 4.1.QScopedPointer 4.2.QScopedArrayPointer 5.追踪特定QObject对象生命 6.总结 1.引言 在 Qt 中&#xff0c;智能指针…

计算样本之间的相似度

文章目录 前言一、距离度量1.1 欧几里得距离&#xff08;Euclidean Distance&#xff09;1.2 曼哈顿距离&#xff08;Manhattan Distance&#xff09;1.3 切比雪夫距离&#xff08;Chebyshev Distance&#xff09;1.4 闵可夫斯基距离&#xff08;Minkowski Distance&#xff09…

docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤

容器技术 容器借鉴了集装箱的概念&#xff0c;集装箱解决了什么问题呢&#xff1f;无论形状各异的货物&#xff0c;都可以装入集装箱&#xff0c;集装箱与集装箱之间不会互相影响。由于集装箱是标准化的&#xff0c;就可以把集装箱整齐摆放起来&#xff0c;装在一艘大船把他们…

浏览器插件利器-allWebPluginV2.0.0.14-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

Spring Boot+Blockchain:区块链入门Demo

1. 引言 区块链技术近年来迅速发展&#xff0c;其去中心化、不可篡改和透明性等特点吸引了众多开发者和企业的关注。为了便于理解和应用区块链技术&#xff0c;本文将介绍如何使用Spring Boot集成区块链&#xff0c;构建一个简单的区块链Demo。 2. 项目准备 2.1 环境要求 在…

MYSQL安装及环境配置

1.数据库下载 1.1 浏览器下载相应版本&#xff0c;如果相应版本不在此页&#xff0c;可点击Archives &#xff0c;然后选择相应版本 https://dev.mysql.com/downloads/mysql/ 1.2 放置指定目录&#xff0c;并将其解压 2.配置数据库环境变量 2.1 使用电脑win键 Q &#xff0c;…

在C++中使用的错误处理策略

在C中&#xff0c;错误处理是一个重要且复杂的主题&#xff0c;因为它要求开发者在设计和编码时考虑到程序可能遇到的各种异常情况。C提供了几种不同的机制来处理错误&#xff0c;每种机制都有其适用的场景和优缺点。下面我将概述几种常见的C错误处理策略&#xff1a; 1. 返回…

SQL的时间格式和文本灵活转换

日期的格式&#xff0c;在日常的数据分析中&#xff0c;常常使用 特别是在按照日、月、年进行汇总分析&#xff0c;使用起来&#xff0c;往往会有差异 如果格式比较复杂&#xff0c;可以考虑进行文本转化的处理 这里有比较推荐的函数&#xff1a; 1.CONVERT()函数 适用于SQL …

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度&#xff0c;逆向转90度 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 步进电机可以理解为&#xff1a;是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于&#xff0c;普通电机可以持…

CompletionService

必备知识&#xff1a; 三种创建线程的方式 java线程池 CompletionService是Java并发库中的一个接口&#xff0c;用于简化处理一组异步任务的执行和结果收集。它结合了Executor和BlockingQueue的功能&#xff0c;帮助管理任务的提交和完成。CompletionService的主要实现类是Exe…

前端必修技能:高手进阶核心知识分享 - CSS 阴影属性详解

CSS 涉及设计到阴影的相关内容包括三个方面&#xff1a;box-shadow属性&#xff08;盒子阴影&#xff09;、 text-shadow属性&#xff08;文本阴影&#xff09;、drop-shadow滤镜。 本篇文章旨在详细介绍和分析三种阴影的具体参数设置和典型用例。 box-shadow属性&#xff08;…

预防临床预测模型中可能的“算法歧视”

预防临床预测模型中可能的“算法歧视” 概要&#xff1a;如果训练数据中存在性别方面的不均衡&#xff0c;会让训练出的模型存在性别方面的“算法歧视”&#xff0c;进而导致某种性别下存在更多的误诊误治&#xff0c;最终造成医疗资源分配的不公平的伦理问题&#xff0c;导致模…