Spring STOMP-消息处理流程

一旦STOMP的接口被公布,Spring应用程序就成为连接客户端的STOMP代理。本节描述服务端消息处理的流程。

spring-messaging模块包含消息类应用的基础功能,这些功能起源于Spring Integration项目。并且,后来被提取整合到Spring框架,以便在更多的Spring项目和应用场景中更广泛地使用。下面列出了模块里包含的消息抽象:

  • Message: 消息的简单表示,包括头部和有效载荷。
  • MessageHandler: 消息处理器。
  • MessageChannel: 发送消息的渠道,实现生产者和消费者的解耦。
  • SubscribableChannel: 带有MessageHandler订阅者的MessageChannel
  • ExecutorSubscribableChannel: 使用Executor 线程池来发送消息的SubscribableChannel

Java配置(即@EnableWebSocketMessageBroker)和XML命名空间配置(即<websocket:message-broker>)使用前面的组件来组装消息工作流。下面的图表显示了,在使用程序内置的消息代理时用到的组件:

上图展示了三个消息通道:

  • clientInboundChannel: 用于接收来自WebSocket客户端的消息。
  • clientOutboundChannel: 用于将服务器的消息发送到WebSocket客户端。
  • brokerChannel: 用于从服务器端应用程序向消息代理发送消息。

下图展示了配置外部代理(如RabbitMQ)用于管理订阅和广播消息时用到的组件:

前面两幅图的主要区别是,第二幅图使用了“broker relay”,通过TCP链接将消息发送到外部的STOMP代理,并将消息从代理发送到订阅的客户端。

当从WebSocket连接接收到消息时,它们被解码为STOMP帧,转换为Spring Message 对象表示,并发送到clientInboundChannel进行进一步处理。例如,目的地头部以/app开头的STOMP消息可能会被路由到控制器中带了@MessageMapping 注解的方法,而/topic/queue 开头的消息可能会直接路由到消息代理。

带了@Controller 注解的程序,在处理客户端发的STOMP消息后,可以通过brokerChannel向消息代理发送消息,代理通过clientOutboundChannel将消息广播给匹配的订阅者。同一个controller也可以对HTTP请求做出相同的响应,因此客户端可以执行一个HTTP POST请求,处理请求的@PostMapping方法可以向消息代理发送消息,然后广播给订阅的客户端。

我们通过一个简单的例子来熟悉流程。下面是配置服务端的示例:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

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

@Controller
public class GreetingController {

	@MessageMapping("/greeting")
	public String handle(String greeting) {
		return "[" + getTimestamp() + ": " + greeting;
	}
}

前面的示例支持以下流程:

  1. 客户端连接到http://localhost:8080/portfolio,一旦建立WebSocket连接,STOMP帧就开始在它上面传输。
  2. 客户端发送一个destination消息头值为/topic/greeting的SUBSCRIBE帧。一旦接收并解码,消息被发送到clientInboundChannel,然后被路由到消息代理,代理存储了客户端订阅信息。
  3. 客户端向/app/greeting发送一个SEND帧。/app前缀的消息会路由到带注解的控制器上。在删掉了/app前缀之后,destination值剩余的部分/greeting 会映射到GreetingController中的@MessageMapping方法上。
  4. GreetingController返回的值被转换成一个Spring Message 对象,方法的返回值放入消息的payload,消息的默认destination消息头是/topic/greeting(从输入的destination派生而来,规则是用/topic替换/app)。返回的消息被发送到brokerChannel并由消息代理处理。
  5. 消息代理找到所有匹配的订阅者,并通过clientOutboundChannel向所有订阅者发送一个MESSAGE帧,发送前消息被编码为STOMP帧,并通过WebSocket连接发送。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

RuoYi-Vue-Plus (SpringCache、CacheManager、@Cacheable、缓存雪崩、击穿、穿透)

一、概述 1、SpringCache是Spring提供的一个缓存框架&#xff0c;在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中&#xff0c;在4.1开始&#xff0c;缓存已支持JSR-107注释和更多自定义的选项。 2、SpringCache利用了AOP&#xff0c;实现了基于注解的缓存功能&…

LeetCode 题目 120:三角形最小路径和

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

GPU prompt

提问&#xff1a; GPU是如何与CPU协调工作的&#xff1f; GPU也有缓存机制吗&#xff1f;有几层&#xff1f;速度差异是多少&#xff1f; GPU渲染流程有哪些阶段&#xff1f;他们的功能分别是什么&#xff1f; Early-Z技术是什么&#xff1f;发生在哪个阶段&#xff1f;这个…

7 Days yo Die 七日杀服务器开服联机教程

1、购买后登录服务器&#xff08;百度搜索莱卡云&#xff09;game.lcayun.com 进入控制面板后会出现正在安装的界面&#xff0c;安装时长约5分钟左右 安装成功后你就可以看到我们的控制台界面 复制服务器ip地址打开游戏➡加入游戏 有两种方法加入游戏 第一种方法&#xff1a;…

电商平台商品数据的价值在哪里?如何实现批量抓取?

一、电商平台商品数据的价值探秘 在数字经济的浪潮中&#xff0c;电商平台商品数据如同一座蕴藏着无尽宝藏的矿山&#xff0c;其价值远超过我们表面的认知。今天&#xff0c;就让我们一起揭开这座矿山的神秘面纱&#xff0c;探寻其中的奥秘。 首先&#xff0c;电商平台商品数…

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得…

c++:刷题必备 容器map的使用

文章目录 map的概念map的使用构造![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/30e9a697b50d47a591af6e9ae2bbb7d7.png)insert迭代器遍历 findoperator[]举例 map的概念 map是一个关联容器,里面的每一个位置pair,会存储两个值,一个是key,另一个是value. 我们可以…

【MySQL数据库开发设计规范】之表设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

使用 Docker 部署 VS Code in The Browser

1&#xff09;介绍 GitHub&#xff1a;https://github.com/coder/code-server 在日常学习工作中&#xff0c;Vscode 已成为我们首选的代码编辑器。然而&#xff0c;其局限性在于当我们从家到公司移动时&#xff0c;难以保持连续的编码体验。针对这一痛点&#xff0c;虽然市面上…

只需三步将Kimi接入微信公众号

今天我将手把手交大家如何把Kimi大模型接入微信公众号&#xff0c;创建属于你自己的公众号智能助理&#xff0c;让你的公众号具备智能对话、文件阅读、信息搜索等强大功能&#xff0c;同时提高用户互动率、减少人工客服压力等。 废话不多说&#xff0c;先来看看实际效果吧~ 一…

16 华三数据中心最流行的技术 M-LAG

STP和MTP&#xff08;第二十二课&#xff09;-CSDN博客 VRRP技术和浮动路由(第二十六课)_vrrp 浮动路由-CSDN博客 VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)-CSDN博客 04 交换机的IRF的配置-CSDN博客 1 M-LAG AI介绍 M-LAG&#xff08;Multi-Chassis Link Aggrega…

Electron学习笔记(一)

文章目录 相关笔记笔记说明 一、轻松入门 1、搭建开发环境2、创建窗口界面3、调试主进程 二、主进程和渲染进程1、进程互访2、渲染进程访问主进程类型3、渲染进程访问主进程自定义内容4、渲染进程向主进程发送消息5、主进程向渲染进程发送消息6、多个窗口的渲染进程接收主进程发…

【python】python淘宝交易数据分析可视化(源码+数据集)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

模型推导:BG/NBD(预测用户生命周期(CLV)模型)

CLV&#xff08;Customer Lifetime Value&#xff09;指的是客户生命周期价值&#xff0c;用以衡量客户在一段时间内对企业有多大的价值。企业对每个用户的流失与否、在未来时间是否会再次购买&#xff0c;还会再购买多少次才会流失等问题感兴趣&#xff0c;本文中的BG/NBD模型…

PostgreSQL数据库创建只读用户的权限安全隐患

PostgreSQL数据库模拟备库创建只读用户存在的权限安全隐患 default_transaction_read_only权限授权版本变更说明 看腻了就来听听视频演示吧&#xff1a;https://www.bilibili.com/video/BV1ZJ4m1578H/ default_transaction_read_only 创建只读用户&#xff0c;参照备库只读模…

第三步->手撕spring源码之基于Cglib实现实例化策略

为什么深入研究spring源码&#xff1f; 其实每一个程序员每天的工作都是一贯的CRUD 实现业务和需求完成的操作。几年这样的操作让我感觉在这方面要提神能力 光靠CRUD是绝对不可能的事情 CRUD只是满足你作为一个搬砖人而已。编程能力提升&#xff1f;其实更多的编程能力的提升是…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

Promise.all和 race

Promise.all() all方法可以完成并行任务&#xff0c; 它接收一个数组&#xff0c;数组的每一项都是一个promise对象。返回值&#xff1a; 成功时&#xff1a;当数组中所有的promise的状态都达到resolved的时候&#xff0c;就返回包含所有 Promise 结果的数组&#xff0c;并且…

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题&#xff1a;C中struct和class的区别是什么&#xff1f; 4.2 封装 【面试…