Spring Boot中的STOMP Broker:原理及使用

news2024/9/20 14:47:36

Spring Boot中的STOMP Broker:原理及使用在这里插入图片描述

简介

STOMP(Simple Text Oriented Messaging Protocol)是一种基于文本的协议,用于在Web应用程序之间传递消息。STOMP提供了一种简单的方式来实现WebSocket的双向通信。在Spring Boot中,我们可以使用STOMP来实现WebSocket的双向通信。

STOMP Broker是STOMP协议的一种实现,它用于在Web应用程序之间传递消息。在Spring Boot中,我们可以使用Spring WebSocket模块提供的STOMP Broker来实现WebSocket的双向通信。

本文将介绍Spring Boot中的STOMP Broker的原理及使用方法。

原理

在Spring Boot中,STOMP Broker是用于在Web应用程序之间传递消息的代理服务器。STOMP Broker允许多个WebSocket客户端之间进行双向通信。当一个WebSocket客户端发送一个消息时,STOMP Broker会将该消息路由到目标WebSocket客户端上。

在Spring Boot中,我们可以使用@EnableWebSocketMessageBroker注解来启用WebSocket消息代理。当该注解被应用时,Spring Boot将自动配置WebSocket消息代理,以便我们可以使用@MessageMapping和@SendTo等注解来处理WebSocket消息。

在STOMP Broker中,我们可以使用@MessageMapping注解来处理WebSocket消息。当一个WebSocket客户端发送一个消息时,STOMP Broker会将该消息路由到标记有@MessageMapping注解的处理方法中进行处理。处理方法可以将消息发送到另一个WebSocket客户端,也可以将消息发送到一个特定的STOMP主题。

下面是一个简单的示例:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

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

    @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() + "!");
        }
    }
}

在上面的例子中,我们定义了一个名为“WebSocketConfig”的Spring Boot配置类,并在其中启用了WebSocket消息代理。我们使用@EnableWebSocketMessageBroker注解来启用WebSocket消息代理,并实现了WebSocketMessageBrokerConfigurer接口来配置WebSocket消息代理。

在configureMessageBroker方法中,我们使用config.enableSimpleBroker(“/topic”)方法来启用一个名为“/topic”的STOMP主题。我们还使用config.setApplicationDestinationPrefixes(“/app”)方法来设置一个名为“/app”的应用程序前缀,用于标识应用程序的WebSocket消息。

在registerStompEndpoints方法中,我们使用registry.addEndpoint(“/websocket”).withSockJS()方法来注册一个名为“/websocket”的WebSocket端点,并启用SockJS支持。

在WebSocket控制器中,我们定义了一个标记有@MessageMapping注解的处理方法,该方法用于处理名为“/hello”的WebSocket消息,并将处理结果发送到名为“/topic/greetings”的STOMP主题。

如何使用

使用STOMP Broker处理WebSocket消息的过程非常简单。我们只需要在WebSocket控制器中定义一个或多个标记有@MessageMapping注解的处理方法,并使用@SendTo注解将处理结果发送到指定的STOMP主题即可。

在我们的处理方法中,我们可以使用@Payload注解来标识WebSocket消息的有效负载。在这个例子中,我们使用@Payload注解来将WebSocket消息的有效负载反序列化为HelloMessage对象。

除了@MessageMapping注解和@SendTo注解之外,Spring Boot还提供了许多其他的注解和工具,以帮助我们更轻松地处理WebSocket消息。例如,@SubscribeMapping注解可以用于订阅一个STOMP主题;@DestinationVariable注解可以用于获取STOMP主题中的变量值;@Header注解可以用于获取WebSocket消息中的标头等等。

下面是一个简单的示例,演示如何使用STOMP Broker处理WebSocket消息:

1. 添加依赖

首先,我们需要在我们的Spring Boot应用程序中添加WebSocket和STOMP依赖。在我们的pom.xml文件中添加以下依赖:

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

2. 配置WebSocket消息代理

然后,我们需要在我们的Spring Boot应用程序中配置WebSocket消息代理。在我们的配置类中添加@EnableWebSocketMessageBroker注解,以启用WebSocket消息代理。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

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

在上面的示例中,我们使用config.enableSimpleBroker(“/topic”)方法来启用一个名为“/topic”的STOMP主题,并使用config.setApplicationDestinationPrefixes(“/app”)方法来设置一个名为“/app”的应用程序前缀,用于标识应用程序的WebSocket消息。我们还使用registry.addEndpoint(“/websocket”).withSockJS()方法来注册一个名为“/websocket”的WebSocket端点,并启用SockJS支持。

3. 编写WebSocket控制器

接下来,我们需要编写一个WebSocket控制器来处理WebSocket消息。在我们的控制器中,我们可以使用@MessageMapping注解来处理WebSocket消息,并使用@SendTo注解将处理结果发送到指定的STOMP主题。

@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() + "!");
    }
}

在上面的示例中,我们定义了一个标记有@Controller注解的WebSocket控制器,并在其中定义了一个名为“/hello”的处理方法,用于处理WebSocket消息。我们使用@Payload注解将WebSocket消息的有效负载反序列化为HelloMessage对象,并使用@SendTo注解将处理结果发送到名为“/topic/greetings”的STOMP主题。

4. 编写WebSocket客户端

最后,我们需要编写一个WebSocket客户端来发送WebSocket消息并接收处理结果。在我们的客户端中,我们可以使用StompClient来连接WebSocket服务器,并使用StompSession来发送和接收STOMP消息。

public class WebSocketClient {

    public static void main(String[] args) throws Exception {
        WebSocketClient webSocketClient = new WebSocketClient();
        webSocketClient.connect();
    }

    private void connect() throws Exception {
        WebSocketStompClient stompClient = new WebSocketStompClient(new StandardWebSocketClient());
        StompSessionHandler sessionHandler = new MyStompSessionHandler();
        stompClient.connect("ws://localhost:8080/websocket", sessionHandler);
        Thread.sleep(5000);
    }

    private static class MyStompSessionHandler extends StompSessionHandlerAdapter {

        @Override
        public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
            session.subscribe("/topic/greetings", new StompFrameHandler() {
                @Override
                public Type getPayloadType(StompHeaders headers) {
                    return Greeting.class;
                }

                @Override
                public void handleFrame(StompHeaders headers, Object payload) {
                    Greeting greeting = (Greeting) payload;
                    System.out.println(greeting.getContent());
                }
            });

            session.send("/app/hello", new HelloMessage("World"));
        }
    }
}

在上面的示例中,我们定义了一个名为“WebSocketClient”的类,并在其中实现了一个名为“connect”的方法。在connect方法中,我们使用WebSocketStompClient来连接WebSocket服务器,并实现了一个名为“MyStompSessionHandler”的StompSessionHandler类,该类用于处理连接到WebSocket服务器的StompSession。

在MyStompSessionHandler类中,我们使用session.subscribe(“/topic/greetings”, new StompFrameHandler() {…})方法订阅名为“/topic/greetings”的STOMP主题,并定义了一个StompFrameHandler类来处理接收到的STOMP消息。我们还使用session.send(“/app/hello”, new HelloMessage(“World”))方法向名为“/hello”的STOMP主题发送一个HelloMessage对象。

总结

Spring Boot中的STOMP Broker是一种用于在Web应用程序之间传递消息的代理服务器。STOMP Broker允许多个WebSocket客户端之间进行双向通信。在Spring Boot中,我们可以使用Spring WebSocket模块提供的STOMP Broker来实现WebSocket的双向通信。

在STOMP Broker中,我们可以使用@MessageMapping注解来处理WebSocket消息。当一个WebSocket客户端发送一个消息时,STOMP Broker会将该消息路由到标记有@MessageMapping注解的处理方法中进行处理。处理方法可以将消息发送到另一个WebSocket客户端,也可以将消息发送到一个特定的STOMP主题。

使用STOMP Broker处理WebSocket消息的过程非常简单。我们只需要在WebSocket控制器中定义一个或多个标记有@MessageMapping注解的处理方法,并使用@SendTo注解将处理结果发送到指定的STOMP主题即可。

在编写WebSocket客户端时,我们可以使用StompClient来连接WebSocket服务器,并使用StompSession来发送和接收STOMP消息。

最后,Spring Boot提供了许多其他的注解和工具,以帮助我们更轻松地处理WebSocket消息。例如,@SubscribeMapping注解可以用于订阅一个STOMP主题;@DestinationVariable注解可以用于获取STOMP主题中的变量值;@Header注解可以用于获取WebSocket消息中的标头等等。

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

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

相关文章

centos7.X安装docker---个人学习经验

工具&#xff1a;VMware Workstation Pro 16.1 系统&#xff1a;CentOS-7-x86_64-DVD-2009 docker&#xff1a;docker-ce-24.0.2-1 说明&#xff1a;这是个人在学习安装docker的时候一些经验&#xff0c;如有不对的还请指教&#xff0c;有些步骤因个人专业能力和时间问题并未…

Elasticsearch-01篇(单机版简单安装)

Elasticsearch-01篇&#xff08;单机版简单安装&#xff09; 1. 前言1.1 关于 Elastic Stack 2. Elasticsearch 的安装&#xff08;Linux&#xff09;2.1 准备工作2.1.1 下载2.1.2 解压&#xff08;启动不能用root&#xff0c;所以最好此处换个用户&#xff09; 2.2 修改相应的…

2023年上海市浦东新区网络安全管理员决赛理论题样题

目录 一、判断题 二、单选题 三、多选题 一、判断题 1.等保1.0至等保2.0从信息系统拓展为网络和信息系统。 正确 (1)保护对象改变 等保1.0保护的对象是信息系统,等保2.0增加为网络和信息系统,增加了云计算、大数据、工业控制系统、物联网、移动物联技术、网络基础…

vite环境变量

vite环境变量 import.meta.env对象中存储环vite的境变量 环境变量以VITE_ 为前缀 在不同环境下&#xff0c;自动读取不同的文件 一般命名 .env .env.development .env.test .env.production

四格表fisher检验

一、案例介绍 某医生用新旧两种药物治疗某病患者27人&#xff0c;治疗结果见下表&#xff0c;现在想知道两种两种药物的治疗效果有无差别&#xff1f; 二、问题分析 本案例的分析目的是探究两种治疗效果有无差异&#xff0c;总样本量为27<40&#xff0c;所以考虑使用四格表…

NB-IoT模块(BC系列—BC95)详解

NB-IoT模块&#xff08;BC系列—BC95&#xff09; 0. NB-IoT概述技术原理特点和优势应用领域 1. 常用的NB-IoT模块2. BC系列—BC95技术规格功能特点 3. STM32使用BC95方法BC95的AT指令示例代码 0. NB-IoT概述 NB-IoT&#xff08;Narrowband Internet of Things&#xff09;是一…

万字长文解析最常见的数据库恢复算法: ARIES

#万字长文解析最常见的数据库恢复算法: ARIES 首发地址&#xff1a; https://mp.weixin.qq.com/s/Kc13g8OHK1h_f7eMlnl4Aw Introduction 上图中为基于 WAL 的数据库的一种可能的架构情况。其中&#xff0c;In-Memory Data 为数据库数据在内存中的组织形式&#xff0c;可以是 B …

Element-ui 实现多个日期时间发范围查询

1、前端 <el-form-item label"生产时间"> <el-date-picker v-model"dateProduct" style"width: 240px" value-format"yyyy-MM-dd" type"daterange" range-separator"-" start-placeholder"生产开始…

(三)解析函数及其性质

本文主要内容如下&#xff1a; 1. 复变函数的导数与微分1.1. 复变函数可导、可微、解析与奇点的定义1.2. 复变函数可微的充要条件1.3. 关于复变函数可微性判定的其它形式1.4. 相关结论1.5. 解析函数的构造 2. 解析函数与调和函数2.1. 调和函数与共轭调和函数2.2. 解析函数与调和…

cglib bean复制报错:module java.base does not “opens java.lang“ to unnamed module

在使用cglib bean复制功能时&#xff0c;报下面的错误 Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,b…

牛客社区项目续

统一日志记录 我们的这个项目在很多地方都需要记录日志&#xff0c;比如帖子模块、评论模块、消息模块等&#xff0c;而以前我们记录日志都是在某一个功能点中使用日志工厂&#xff0c;像下面这样&#xff1a; 项目中很多地方都需要记录日志&#xff0c;像这样一个地方一个地方…

sumo的几种安装方法

sumo的几种安装方法 sumo有很多中安装方法&#xff0c;根据你需要的任务来自己选择&#xff1a; 采用官网的latest version来进行安装 sudo add-apt-repository ppa:sumo/stable sudo apt-get update sudo apt-get install sumo sumo-tools sumo-doc想要安装源码来进行自己b…

【Java可执行命令】(六)调试工具 jdb:深入解析应用程序调试工具jdb ~

Java可执行命令详解之jdb 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.1.1 参数&#xff1a;-sourcepath < path>3.1.2 指令&#xff1a;run [class [args]]3.1.3 指令&#xff1a;print < expr>3.1.4 指令&#xff1a;stop at< class>:< line>…

如何利用Idea回滚代码以及Cherry-Pick部分代码

引言 大家在版本迭代过程中&#xff0c;是否遇到过开发好的需求&#xff0c;都已经合并到Master分支等待发布后&#xff0c;临时通知不需要上线了的情况。这个时候一般会要求只上一部分紧急功能或者别的新功能&#xff0c;那么这个时候就需要用到Git的Reset以及Cherry-Pick功能…

钉钉机器人用bitmap实现签到记录

现在是周五晚上&#xff0c;下面是一个二进制数字&#xff0c;其中&#xff0c;有16位&#xff0c;最后一位下标是15&#xff0c;今天晚上是14&#xff0c;我签到成功了

一定要收藏的30套可视化大屏制作模板!升职加薪不再是梦想!

前几天和朋友吃饭聊天&#xff0c;他吐槽说老板让他做可视化大屏&#xff0c;但他不会敲代码根本做不出来&#xff0c;老板动动嘴巴子根本不考虑技术难度只想看到成果&#xff0c;他焦虑得都睡不着觉。我给他分享了一套可视化大屏模板&#xff0c;10分钟就制作完成了老板要求的…

了解浏览器缓存

什么是HTTP缓存&#xff0c;如何工作的&#xff1f; 当我们打开一个页面时&#xff0c;会向服务端发起很多次请求&#xff0c;如下图打开百毒首页&#xff0c;发起了HTML、各种图片、JS、CSS等资源共101次请求。这里面很多资源并不会频繁变化&#xff0c;每次打开页面都重新请…

利用Python构建宁德时代、比亚迪、隆基绿能股票时间序列预测模型

存货 import tushare as ts # 导包 import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks from scipy.stats import norm import datetime import pandas as pd import seaborn as sns # pip install seaborn import matplotlib.patches …

Oracle报错:“Error in invoking target ‘agent nmhs’ of makefile...”

前言&#xff1a;Oracle在安装过程中的报错一定要重视&#xff0c;这决定你后续是否能完成安装以及是否能使用。我这边会陆续汇总一些报错现象以及解决方案共享。 ##Install Product 86%报错信息 &#xff1a;“Error in invoking target agent nmhs of makefile...”解决方案…