Spring Boot中的@MessageMapping注解:原理及使用

news2025/1/13 10:14:03

Spring Boot中的@MessageMapping注解:原理及使用

简介

在Web应用程序中,实现实时的双向通信是一项重要的功能。为了实现这种功能,需要使用WebSocket协议。Spring框架提供了Spring WebSocket模块来实现WebSocket通信。Spring Boot是基于Spring框架构建的,它提供了一些方便的注解和自动配置来简化WebSocket的开发。

@MessageMapping注解是Spring Boot提供的一个重要的注解之一,它可以帮助我们处理WebSocket消息。本文将介绍@MessageMapping注解的原理及使用方法。

在这里插入图片描述

原理

在Spring Boot中,@MessageMapping注解用于标识WebSocket消息的处理方法。当客户端发送一个WebSocket消息到服务器端时,@MessageMapping注解可以将该消息路由到对应的处理方法中进行处理。

@MessageMapping注解的使用方法类似于@RequestMapping注解。我们可以将@MessageMapping注解应用在控制器的处理方法上,以处理特定的WebSocket消息。当客户端发送一个特定的消息到服务器端时,服务器就会调用标记有@MessageMapping注解的处理方法来处理该消息。

下面是一个简单的示例:

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

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

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

如何使用

使用@MessageMapping注解处理WebSocket消息的过程非常简单。我们只需要在控制器的处理方法上添加@MessageMapping注解,并指定该方法应该处理的WebSocket消息类型即可。

下面是一个更完整的示例:

@Controller
public class WebSocketController {

    @MessageMapping("/chat/{roomId}")
    @SendTo("/topic/chat/{roomId}")
    public ChatMessage handleChatMessage(@DestinationVariable String roomId, ChatMessage message) {
        return message;
    }
}

在上面的例子中,我们定义了一个WebSocket控制器,并在其中定义了一个标记有@MessageMapping注解的处理方法。该处理方法用于处理名为“/chat/{roomId}”的WebSocket消息,并将处理结果发送到“/topic/chat/{roomId}”主题。

在我们的处理方法中,我们可以使用@DestinationVariable注解来获取WebSocket消息中的路径变量。在这个例子中,我们使用@DestinationVariable来获取roomId路径变量的值。

除了@MessageMapping注解之外,Spring Boot还提供了许多其他的注解和工具,以帮助我们更容易地处理WebSocket消息。例如,@SendTo注解可以将处理结果发送到指定的WebSocket主题;@Payload注解可以用于标识WebSocket消息的有效负载;@Payload注解可以用于将WebSocket消息的有效负载反序列化为Java对象。

示例代码

下面是一个完整的Spring Boot WebSocket应用程序代码示例:

@SpringBootApplication
@EnableWebSocketMessageBroker
public class WebSocketDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebSocketDemoApplication.class, args);
    }

    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {

        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(chatWebSocketHandler(), "/chat/{roomId}").setAllowedOrigins("*");
        }

        @Bean
        public WebSocketHandler chatWebSocketHandler() {
            return new ChatWebSocketHandler();
        }
    }

    @Controller
    public class WebSocketController {

        @MessageMapping("/chat/{roomId}")
        @SendTo("/topic/chat/{roomId}")
        public ChatMessage handleChatMessage(@DestinationVariable String roomId, ChatMessage message) {
            return message;
        }
    }

    public class ChatMessage {
        private String content;
        private String sender;

        // getters and setters
    }

    public class ChatWebSocketHandler extends TextWebSocketHandler {

        private final ObjectMapper objectMapper = new ObjectMapper();

        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
            ChatMessage chatMessage = objectMapper.readValue(message.getPayload(), ChatMessage.class);
            // do something with the chatMessage
        }

        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            // do something after a WebSocket connection is established
        }
    }
}

在上面的代码示例中,我们定义了一个名为“WebSocketDemoApplication”的Spring Boot应用程序。该应用程序使用@EnableWebSocketMessageBroker注解启用WebSocket消息代理,并定义了一个WebSocket控制器和一个WebSocket处理程序。

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

在WebSocket处理程序中,我们使用TextWebSocketHandler来处理WebSocket消息。在handleTextMessage方法中,我们使用ObjectMapper来将WebSocket消息的有效负载反序列化为ChatMessage对象,然后进行一些处理。在afterConnectionEstablished方法中,我们可以执行一些WebSocket连接建立后的操作。

结论

在本文中,我们介绍了Spring Boot中的@MessageMapping注解及其原理和使用方法。使用@MessageMapping注解可以帮助我们更轻松地处理WebSocket消息,从而实现实时的双向通信。除了@MessageMapping注解之外,Spring Boot还提供了许多其他的注解和工具,以帮助我们更轻松地处理WebSocket消息。如果您正在开发WebSocket应用程序,@MessageMapping注解是一个非常有用的工具,它可以帮助您更轻松地处理WebSocket消息。

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

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

相关文章

《刷题日记03》链表

题目描述力扣https://leetcode.cn/problems/LGjMqU/ 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值…

实例003 像开始菜单一样漂亮的菜单

实例说明 Windows的开始菜单非常的独特,在菜单的旁边有一条竖着的彩条,彩条中还写着文字。这种独特的菜单能够使程序的界面看起来更加的漂亮。本例中就实现了这种菜单,运行本例弹出“打开菜单”时,就会看到菜单的左边有一个紫色的…

ChatGPT微调系列一:微调 流程

文章目录 前言一、啥叫微调二、为啥要微调三、不是所有模型都可以微调的四、总述微调的基本流程,以及涉及的主要函数,参数1. 安装2. 准备训练数据3. openai.api_key os.getenv() 进行一个说明4. 通过API 调用模型 常用函数5. 微调模型 常用函数6. OpenA…

【论文阅读】Self-supervised Image-specific Prototype Exploration for WSSS

一篇CVPR2022上的论文,用于弱监督分割 论文标题: Self-supervised Image-specific Prototype Exploration for Weakly Supervised Semantic Segmentation 作者信息: 代码地址: https://github.com/chenqi1126/SIPE 论文链接&…

【doxygen】markdown 表格中插入换行与缩进

文章目录 markdown 表格换行markdown 标准换行doxygen 中 markdown 表格换行 markdown 表格缩进 doxygen 中使用 markdown markdown 表格换行 markdown 表格生成 doxygen 时换行与标准的 markdown 语法稍有差异 markdown 标准换行 markdown 中可以使用 html 的换行标签 <…

Python学习之文件操作【基本操作,JSON文件操作】

前言 Python的文件操作是一个非常重要的主题&#xff0c;它可以用来读取&#xff0c;写入和操作各种类型的文件&#xff0c;包括文本文件、图像文件、音频文件等。在这里&#xff0c;我们将讨论一些基本的Python文件操作和JSON文件操作。 Python文件操作 Python提供了多种方…

73、基于51单片机温湿度光照检测控制esp8266无线WiFi app远程监测报警(程序+原理图+PCB源文件+参考论文+开题报告+元器件清单等)

研究目的 现代的生活中&#xff0c;许多情况都对环境的温湿度有比较严格的要求&#xff0c;因此&#xff0c;必须在某些特定环境安装温湿度报警器对环境的温湿度进行监控和调节。为此&#xff0c;本题目选用花卉温室的温湿度调节为背景环境&#xff0c;研究利用集成温湿度传感…

赛效:PDF文件怎么加密

1&#xff1a;在网页上打开并登录91ai工具&#xff0c;在特色功能里点击“PDF加密”。 2&#xff1a;点击上传文件&#xff0c;将本地PDF文件添加上去。 3&#xff1a;文件上传成功后&#xff0c;在文件下方设置密码后点击“开始加密”。 4&#xff1a;加密完成后点击下方下载按…

YOLOv5改进系列(12)——更换Neck之BiFPN

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

浅谈安科瑞电力监控系统解决方案 安科瑞 许敏

摘要&#xff1a;随着经济的发展&#xff0c;能源消耗速度正不断加快&#xff0c;因此我国提出了绿色可持续发展战略&#xff0c;要求在发展建设中以节能为主&#xff0c;不断减少资源能耗&#xff0c;而电能便是首要控制内容。如今我国为电能使用&#xff0c;对计量表进行了优…

Web 应用程序综合监控

综合监控是什么意思 模拟用户通过 Web 应用程序的旅程并对其进行监控以检测任何增加延迟的元素的过程被广泛称为综合监控或综合测试。 为什么需要综合监测 为了确保最终用户的无缝体验&#xff0c;综合性能监控势在必行。监视综合事务以帮助您了解用户如何与 Web 应用程序交…

flex布局瀑布流占位两边对齐不对称

.page{display: flex;justify-content: space-between;flex-wrap: wrap; }.page:after {content: ;width: 400px; // 也可以 flex:1}

压缩文件——干货代码分享

1.背景 最近写接口遇到通过FTP服务器发送文件的需求&#xff0c;文件内容需加密并压缩&#xff0c;故记录一下&#xff0c;提供已经测试通过的代码。 2.代码 package com.example.demo.utils;import lombok.extern.slf4j.Slf4j;import java.io.*; import java.util.zip.GZIPOu…

大学智慧课堂系统整理

目录 一、题目类型选择器(非组件库) 1.1、效果展示 1.2、代码展示 二、题目类型选择器(Vant组件库) 2.1、效果展示 2.2、代码展示 一、题目类型选择器(非组件库) 使用vue2&#xff1a;在methods里区分单个点击和多个点击&#xff0c;在view视图区分判断题和选择题。 如下…

正则表达式和BeautifulSoup

文章目录 1、正则表达式介绍2、正则表达式和BeautifulSoup3、获取属性4、Lambda表达式 1、正则表达式介绍 正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。它描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来…

​Nature |HiFi宏基因组助力挖掘海洋“新”微生物组

近期在《Nature》发表的一篇研究论文中&#xff0c;表述了如何在罕见的微生物类群和环境中研究未知的酶和天然产物&#xff0c;研究突出了微生物组学在深入挖掘天然产物合成与酶学机制中的关键作用&#xff0c;对海洋生态、进化、生物技术与天然产物等领域的研究具有重要意义。…

基于Java+Vue前后端分离乐购游戏商城系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

制造企业可以通过数字工厂管理系统降低采购成本吗

制造企业可以通过数字工厂管理系统降低采购成本。制造业数字工厂系统是一种基于数字化技术的管理系统&#xff0c;可以帮助企业实现生产过程的数字化管理&#xff0c;提高生产效率和降低生产成本。下面具体介绍数字工厂管理系统如何降低制造企业的采购成本。 一、优化采购计划 …

【两个无穷大的数相加】

两个无穷大的数相加 两个无穷大的数相加&#xff0c;因为int有限,哪怕用long int也不可能够&#xff0c;用string存&#xff0c;用手工算数的方式从右往左一位一位加&#xff0c;满10就进一。这样不管有多长&#xff0c;都能算出结果。 最近在做QT项目&#xff0c;所以用c写的…

荔枝集团战队斩获 2023 Amazon DeepRacer自动驾驶赛车企业总决赛冠军

6月27日&#xff0c;2023 Amazon DeepRacer自动驾驶赛车企业总决赛在上海决出了最终结果&#xff0c;荔枝集团“状元红”战队与Cisco、德勤管理咨询、北京辛诺创新、神州泰岳、敦煌网等12支队伍的竞逐中&#xff0c;在两轮比赛中成绩遥遥领先&#xff0c;最终斩获桂冠。而今年年…