Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

news2024/11/18 15:45:50

Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

WebSocket是一种在Web浏览器和Web服务器之间进行双向通信的技术。在传统的HTTP通信中,客户端向服务器发送请求,服务器响应请求,然后关闭连接。而在WebSocket中,客户端和服务器之间的连接始终保持打开状态,可以随时互相发送消息,实现实时通信。

Spring Boot提供了对WebSocket的支持,通过@EnableWebSocketMessageBroker注解可以快速地启用WebSocket消息代理功能。本文将介绍@EnableWebSocketMessageBroker的原理和使用方法。

在这里插入图片描述

@EnableWebSocketMessageBroker注解是什么

@EnableWebSocketMessageBroker是Spring Framework中的一个注解,用于启用WebSocket消息代理功能。该注解可以在Spring Boot应用程序中使用,使得应用程序能够支持WebSocket通信。

原理

@EnableWebSocketMessageBroker注解的原理是通过配置消息代理来支持WebSocket通信。在使用@EnableWebSocketMessageBroker注解之前,必须先定义一个WebSocket配置类,并通过@Configuration注解标记该类为配置类。

在WebSocket配置类中,需要使用@EnableWebSocketMessageBroker注解来启用WebSocket消息代理功能。该注解会自动配置一个WebSocketMessageBrokerConfigurer实例,并将其注册到Spring应用程序上下文中。

WebSocketMessageBrokerConfigurer是Spring框架中用于配置WebSocket消息代理的接口。通过实现该接口,可以配置WebSocket消息代理的相关参数,例如消息代理的地址、消息类型、消息发送和接收的线程池等。

在启用了WebSocket消息代理之后,可以使用@MessageMapping注解来定义WebSocket消息的处理方法。@MessageMapping注解用于指定WebSocket请求的地址,当客户端向该地址发送请求时,会自动调用对应的处理方法进行处理。

如何使用

下面我们来演示如何使用@EnableWebSocketMessageBroker注解和相关注解来实现WebSocket通信。

步骤1:添加依赖

在使用@EnableWebSocketMessageBroker之前,需要在项目中添加以下依赖:

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

步骤2:定义WebSocket配置类

在项目中定义一个WebSocket配置类,用于配置WebSocket消息代理的相关参数。具体代码如下:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }
}

该配置类中使用@EnableWebSocketMessageBroker注解来启用WebSocket消息代理功能,使用configureMessageBroker方法来配置消息代理的相关参数,使用registerStompEndpoints方法来注册Stomp协议的WebSocket端点。

在configureMessageBroker方法中,我们使用enableSimpleBroker方法来配置消息代理的地址,这里我们将消息代理地址设置为"/topic",表示所有以"/topic"开头的消息都会被路由到消息代理上。setApplicationDestinationPrefixes方法用于设置应用程序的目的地前缀,这里我们将其设置为"/app",表示所有以"/app"开头的消息都会被路由到控制器上。

在registerStompEndpoints方法中,我们使用addEndpoint方法来添加WebSocket端点,这里我们将WebSocket端点设置为"/ws",并使用withSockJS方法启用SockJS支持,以便在不支持WebSocket的浏览器上进行通信。

步骤3:定义WebSocket控制器

在项目中定义一个WebSocket控制器,用于处理WebSocket消息。具体代码如下:

@Controller
public class WebSocketController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " +message.getName() + "!");
    }
}

该控制器中使用@MessageMapping注解来定义WebSocket请求的地址,这里我们将请求地址设置为"/hello",表示当客户端向该地址发送请求时,会自动调用greeting方法进行处理。@SendTo注解用于指定WebSocket响应的地址,当处理方法返回响应时,会自动将响应发送到该地址。

在greeting方法中,我们通过Thread.sleep方法模拟了1秒钟的延迟,并返回一个包含问候语的Greeting对象。

步骤4:编写前端代码

最后,我们需要编写前端代码来与WebSocket进行通信。在这里,我们使用了SockJS和Stomp.js来实现WebSocket通信。具体代码如下:

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/greetings', function(greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    console.log("Disconnected");
}

function sendName() {
    var name = $("#name").val();
    stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

$(function () {
    $("form").on('submit', function (e) {
        e.preventDefault();
    });
    $("#connect").click(function() { connect(); });
    $("#disconnect").click(function() { disconnect(); });
    $("#send").click(function() { sendName(); });
});

在上述代码中,我们首先定义了一个connect函数来创建WebSocket连接。在连接成功后,我们使用subscribe方法来订阅"/topic/greetings"地址,当有消息到达时,会自动调用showGreeting方法来显示消息。

在sendName函数中,我们通过stompClient.send方法向"/app/hello"地址发送消息,其中包含一个名为"name"的属性,该属性的值为用户输入的姓名。

最后,在页面加载完成后,我们使用jQuery来注册事件监听器,以便在用户单击按钮时调用相关函数。

总结

@EnableWebSocketMessageBroker注解是Spring Boot中用于启用WebSocket消息代理功能的注解。通过配置消息代理和定义WebSocket控制器,可以实现WebSocket通信。在实际应用中,我们可以使用SockJS和Stomp.js来简化WebSocket通信的开发。

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

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

相关文章

黑马Java项目实战-瑞吉外卖-笔记01

视频地址&#xff1a;黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目_哔哩哔哩_bilibili资料下载&#xff1a;百度网盘【黑马程序员-Java瑞吉外卖-企业级项目实战-平台实战开发】 黑马Java项目实战-瑞吉外卖-笔…

PHP表单传值和文件上传:深入解析数据交互与文件处理技术

目录 表单传值 为什么要表单传值&#xff1f; 表单传值的方式 GET传值 POST传值 GET和POST两种传参方式的不同&#xff1a; PHP接受数据的三种方式 PHP处理复选框数据 复选框表单的命名方式 复选框数据的接受形式 复选框数据的常见处理 复选框细节&#xff1a; 文件…

区块链技术如何改变Web3认证的现状?

随着加密货币和区块链技术的迅猛发展&#xff0c;Web3钱包成为了数字经济时代中的重要组成部分。Web3钱包是一种工具&#xff0c;用于存储、管理和交互加密货币及其他数字资产&#xff0c;以及与去中心化应用程序&#xff08;DApp&#xff09;进行交互。它们是实现Web3.0理念的…

chatgpt赋能python:标题:免费的Python编辑器:优秀的编程工具免费获取

标题&#xff1a;免费的Python编辑器&#xff1a;优秀的编程工具免费获取 Python是一种高级编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发和科学计算等领域。Python编程简单易学&#xff0c;更重要的是它的灵活性和扩展性&#xff0c;吸引了越来越多的开发者加…

自适应混沌粒子群算法(Matlab)

在上一个博客中作者介绍了标准粒子群及其实现&#xff0c;并给出了许多改进方向&#xff0c;那么从这一期开始就会陆续更新关于粒子群的改进&#xff0c;这一期的改进主要有三个方向&#xff0c;1.混沌初始化粒子群 2 非线性调整惯性权重 3 学习因子动态变化。 下面将对这些改进…

网络犯罪分子在新的代理劫持活动中劫持脆弱的SSH服务器

一个活跃的金融活动针对的是脆弱的SSH服务器&#xff0c;以隐蔽地将它们纳入一个代理网络。 "Akamai研究员Allen West在周四的一份报告中说&#xff1a;"这是一个活跃的活动&#xff0c;攻击者利用SSH进行远程访问&#xff0c;运行恶意脚本&#xff0c;隐蔽地将受害…

正点原子stm32HAL库学习_基础篇_1

单片机简介 STM32芯片分类 ST中文社区网&#xff1a;https://www.stmcu.org.cn/ ST官网&#xff1a;https://www.st.com/content/st_com/en.html STM32命名规则 数据手册 在设计STM32F103 原理图的时候&#xff0c;我们需要用到一个非常重要的文档&#xff1a;STM32F103 数据 …

Tomcat的概念及部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Tomcat的概述1.tomcat 概述2.tomcat 的主要特点 二、Tomcat的核心组件1.核心组件关系图2.核心组件的介绍2.1 Web容器2.2 servlet容器2.3 JSP容器2.4 Tomcat核心…

7、Redis复制(replica)

Redis复制(replica) 是什么&#xff1f; 就是主从复制&#xff0c;master以写为主&#xff0c;Slave以读为主。当master数据变化的时候&#xff0c;自动将新的数据异步同步到其它slave数据库 读写分离 容灾恢复 数据备份 水平扩容支撑高并发 案例演示 架构说明 一个Master两个…

SQL-每日一题【182.查找重复的电子邮箱】

题目 表: Person 编写一个 SQL 查询来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL。 以 任意顺序 返回结果表。 查询结果格式如下例。 示例 1: 解题思路 前置知识 count&#xff08;&#xff09; 1.count(*) &#xff1a;统计所有的行数&a…

KMeans算法实现图像分割

1. Kmeans聚类算法简介 由于具有出色的速度和良好的可扩展性&#xff0c;Kmeans聚类算法算得上是最著名的聚类方法。Kmeans算法是一个重复移动类中心点的过程&#xff0c;把类的中心点&#xff0c;也称重心(centroids)&#xff0c;移动到其包含成员的平均位置&#xff0c;然后重…

数据结构和算法-2023.06.29

斐波那契数列 初衷&#x1f481;&#x1f3fb; 说来也是惭愧&#xff0c;入行这么久了&#xff0c;一直没有仔细去思考为什么去做这个&#xff0c;之前一直游想法去好好学学数据结构和算法&#xff0c;一直苦于是重点学习Docker、K8S、JVM&#xff0c;多线程&#xff0c;或者是…

SpringBoot整合Redis缓存管理

1. 添加 Spring Data Redis 依赖启动器。在 chapter06 项目的 pom.xml 文件中添加 Spring Data Redis 依赖 启动器。 <!-- 引入整合 Redis 缓存的依赖启动器 --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>…

【单片机】STM32F103C8T6单片机,OLED 1.3寸 IIC OLED,STM32F103单片机,I2C OLED

文章目录 main.coled.coled.hOLED_Font.h 效果&#xff1a; main.c #include "sys.h" #include "usart.h" #include "OLED.h"int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 设置NVIC中断分组2:2位抢占优…

C/C++图形库EasyX保姆级使用教程(一) Microsoft Visual Studio 2022和EasyX的下载及安装使用

C/C图形库EasyX保姆级使用教程 第一章 Microsoft Visual Studio 2022和EasyX的下载及安装使用 文章目录 C/C图形库EasyX保姆级使用教程前言一、图形库【EasyX】是什么&#xff1f;二、2.EasyX图形库和Microsoft Visual Studio 2022的安装1.Microsoft Visual Studio 2022&#…

详细讲述,人工智能、机器学习、深度学习、神经网络、自然语言处理、AIGC之间的关系...

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是计算机科学中一个庞大的研究领域&#xff0c;旨在为计算机创造类似人类智能的功能&#xff0c;例如学习、推理、解决问题、识别模式、理解自然语言等。AI的核心目标是使计算机能够执行那些通常需要人类…

sql读取数据直接存成pandas

导包 import pymysql import pandas as pd获取mysql链接 def get_db():#打开数据库连接db pymysql.connect(host*.*.*.*,port3306,user "wws",passwd "yourpasswd",db "youdb")return db db get_db()写sql 读数据保存 sql "select…

【技术分享】RK356X Debian/Ubuntu 系统安装Docker

本文基于IDO-SBC3528主板演示Debian/Ubuntu 系统任何安装Docker&#xff0c;方法适用于RK3568全系列产品。 IDO-SBC3528-V1采用RK3568四核64位开发的智能主板&#xff0c;可作为RK3568开发评估板&#xff0c;支持8G大内存&#xff1b;支持PCIE2.0接口&#xff0c;可扩展大容量…

数据结构——直接插入排序与希尔排序(图示+文字详解)

内容包括&#xff1a;排序的代码实现&#xff0c;排序原理详解&#xff0c;代码详解&#xff0c;图示 part 1&#xff1a;直接插入排序 代码实现&#xff1a; void InsertSort(int* a, int n) {int i 0;for (i 0; i < n - 1; i){int end i;int tmp a[i 1];while (en…

【已解决】ubuntu下谷歌浏览器不能上网(而火狐可以上网)

现象&#xff1a;ubuntu18.04安装的谷歌浏览器chrome不能上网(谷歌和百度都不可以)&#xff0c;而火狐可以访问谷歌和百度。 问题解决[参考]&#xff1a;将HTTPS Proxy的代理端口号也设为7890就ok了