Spring STOMP-用户的目的地

应用程序可以发送针对特定用户的消息,并且Spring的STOMP支持识别以/user/为前缀的destination。例如,客户端可能会订阅/user/queue/position-updates的destination。UserDestinationMessageHandler处理此destination,并将其转换为特定于用户会话的destination(例如/queue/position-updates-user123)。这提供了订阅通用命名destination的便利,同时确保与其他订阅相同目的地的用户没有冲突,以便每个用户都可以接收到独特的股票位置更新。

使用用户目标时,配置代理和应用程序目标前缀非常重要,如启用 STOMP 中所示,否则代理将处理仅应由 UserDestinationMessageHandler 处理的“/user”前缀消息。

在发送端,消息可以发送到诸如 /user/{username}/queue/position-updates 之类的destination,而该destination又由 UserDestinationMessageHandler 转换为一个或多个destination,每个destination对应与用户关联的每个会话。这使得应用程序中的任何组件都可以发送针对特定用户的消息,而无需知道除用户名和通用destination之外的任何信息。这也可以通过注释和消息模板来支持。

消息处理方法可以通过@SendToUser注解向正在处理的消息关联的用户发送消息(也可以在类级别上支持,以共享一个共同的目的地),如下例所示:

@Controller
public class PortfolioController {@MessageMapping("/trade")@SendToUser("/queue/position-updates")public TradeResult executeTrade(Trade trade, Principal principal) {*// ...*return tradeResult;}
}

如果用户有多个会话,则默认情况下,订阅给定destination的所有会话都会成为目标。然而,有时,可能需要仅针对发送正在处理的消息的会话。你可以通过将broadcast属性设置为 false 来实现此目的,如以下示例所示:

@Controller
public class MyController {@MessageMapping("/action")public void handleAction() throws Exception{*// raise MyBusinessException here*}@MessageExceptionHandler@SendToUser(destinations="/queue/errors", broadcast=false)public ApplicationError handleException(MyBusinessException exception) {*// ...*return appError;}
}

虽然用户destination通常意味着已认证的用户,但这并不是严格要求的。未与已认证用户关联的WebSocket会话可以订阅用户destination。在这种情况下,@SendToUser注解的行为与broadcast=false完全相同(即,仅定位发送正在处理的消息的会话)。

你可以通过注入由Java配置或XML命名空间创建的SimpMessagingTemplate来向用户destinations发送消息。(如果需要通过@Qualifier进行限定,bean名称为brokerMessagingTemplate)。以下示例展示了如何执行此操作:

@Service
public class TradeServiceImpl implements TradeService {private final SimpMessagingTemplate messagingTemplate;@Autowiredpublic TradeServiceImpl(SimpMessagingTemplate messagingTemplate) {this.messagingTemplate = messagingTemplate;}*// ...*public void afterTradeExecuted(Trade trade) {this.messagingTemplate.convertAndSendToUser(trade.getUserName(), "/queue/position-updates", trade.getResult());}
}

当你将用户目标与外部消息代理一起使用时,应检查代理文档了解如何管理不活动的队列,以便在用户会话结束后,删除所有唯一的用户队列。例如,当你使用 /exchange/amq.direct/position-updates 等destinations时,RabbitMQ 会创建自动删除队列。因此,在那种情况下,客户端可以订阅/user/exchange/amq.direct/position-updates。同样,ActiveMQ有配置选项来清除不活动的目的地。

在多应用程序服务器场景中,由于用户连接到不同的服务器,因此用户destination可能仍未解析。在这种情况下,你可以配置一个destination来广播未解析的消息,以便其他服务器有机会尝试。这可以通过 Java 配置中 MessageBrokerRegistryuserDestinationBroadcast 属性和 XML 中 message-broker 元素的 user-destination-broadcast 属性来完成。

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

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

相关文章

单位个人如何向期刊投稿发表文章?

在单位担任信息宣传员一职以来,我深感肩上的责任重大。每月的对外信息宣传投稿不仅是工作的核心,更是衡量我们部门成效的重要指标。起初,我满腔热血,以为只要勤勉努力,将精心撰写的稿件投至各大报社、报纸期刊的官方邮箱,就能顺利登上版面,赢得读者的青睐。然而,现实远比理想骨…

Java入门基础学习笔记23——For循环结构

1、for循环: 控制一段代码反复执行很多次。 2、For循环语句的基本结构: for(初始化表达式;判断表达式;递增(递减)表达式) {循环体语句(重复执行的代码) } 例&#xff1…

【碎片知识】2024_05_15

char int long float double运算的时候是从低转到高的&#xff0c;表达式的类型会自动提升或者转 换为参与表达式求值的最上级类型. 关于代码的说法正确的是&#xff08; &#xff09; #include <stdio.h> int main() {int x -1;unsigned int y 2;if (x > y){printf…

论文合集整理推荐2024.5.15

‍2012年论文合集&#xff1a;论文入口 ‍2019年论文合集&#xff1a;论文入口 2022年论文合集&#xff1a;论文入口 2023年论文合集&#xff1a;论文入口 2024年论文合集&#xff1a;论文入口

RustGUI学习(iced)之小部件(十三):如何使用qrcode部件来生成和显示二维码?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第十三篇,主要讲述qr_code二维码部件的使用,会结…

Linux-笔记 man手册命令

man 1&#xff1a;用户级别的命令。这些是用户可以直接在shell中执行的命令&#xff0c;例如ls、cp、rm等。 man 2&#xff1a;系统调用。这部分包含了操作系统提供的底层功能&#xff0c;通常是C语言的函数原型&#xff0c;由程序或库调用。 man 3&#xff1a;库函数。这部分…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要&#xff1a; 本设计基于STM32单片机&#xff0c;旨在实现一个智能安防系统&#xff0c;主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作&#xff0c;实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…

Java中List不同实现类的对比

Java中List不同实现类的对比 在Java中&#xff0c;List接口是一个非常重要的集合接口&#xff0c;它表示一个有序的集合&#xff0c;可以包含重复的元素。List接口有很多不同的实现类&#xff0c;其中最常用的是ArrayList、LinkedList和Vector。这些实现类在性能、使用方式和适…

CSP认证刷题笔记(2)ISBN号码(13年CSP认证第二题)

文章目录 题目描述基本思路 题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应。ISBN 码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如x-xxx-xxxxx-x&#xff0c;其中符号- 是分隔符&#xff08;键盘上的减号&#xff09;&#xff0c;最后一位是识别码&…

OSG编程指南<二十三>:基于OSG+ImGui制作模型编辑器,实现三轴方向的实时平移、旋转和缩放变化

1、概述 在OSG的开发应用过程中&#xff0c;我们有时候总会纠结于使用MFC还是Qt来嵌入OSG窗口以便于后续的功能开发&#xff0c;毕竟选择一个合适的UI框架&#xff0c;对于后续的开发还是省去很多麻烦的。但对于初学者来说&#xff0c;可能对框架消息机制的不熟悉&#xff0c;尤…

项目8-头像的上传

js实现头像上传并且预览图片功能以及提交 - 掘金 (juejin.cn) 我们简单建立一个表 1.前端知识储备 1.1 addClass的使用 1.基本语法 addClass() 方法向被选元素添加一个或多个类。 该方法不会移除已存在的 class 属性&#xff0c;仅仅添加一个或多个 class 属性。 提示&…

Java处理xml

Java处理xml DOM&#xff08;Document Object Model&#xff09;读取写入参考文献[Java DOM 教程](https://geek-docs.com/java/java-tutorial/dom.html#ftoc-heading-5) DOM&#xff08;Document Object Model&#xff09; Java的DOM&#xff08;Document Object Model&#…

Pathlib,一个不怕迷路的 Python 向导

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

全网最全的基于电机控制的38类simulink仿真全家桶----新手大礼包

整理了基于电机的38种simulink仿真全家桶&#xff0c;包含多种资料&#xff0c;类型齐全十分适合新手学习使用。包括但是不局限于以下&#xff1a; 1、基于多电平逆变器的无刷直流电机驱动simulink仿真 2、基于负载转矩的感应电机速度控制simulink仿真 3、基于滑膜观测器的永…

C语言学习细节|C语言面向对象编程!函数指针如何正确使用

文章目录 1.函数指针定义2.格式3.应用回调函数动态函数调用函数的间接调用 4.结构体与函数指针结合 1.函数指针定义 函数指针就是一个指向函数的指针变量&#xff0c;与指向数据的指针不同&#xff0c;函数指针保存的是函数的地址&#xff0c;这使得程序可以动态地调用不同的函…

贪吃蛇(C++)

使用EasyX图形库绘制&#xff0c;在VC中安装&#xff0c;EasyX官网&#xff1a;EasyX Graphics Library for C EasyX官方文档&#xff1a;EasyX 文档 - 使用教程 #include<iostream> #include<easyx.h> #include<vector>//顺序表&#xff0c;容器 #include…

【代码随想录37期】Day08 反转字符串、反转字符串Ⅱ、替换数字、反转字符串里面的单词、右旋转字符串

反转字符串 解题思路&#xff1a; 数组双指针法&#xff1a;使用两个数组索引子来交换元素&#xff0c;调用自定义的swapElement函数或库函数swap都可以 注意&#xff1a; 1. 数组元素交换时&#xff0c;不能直接使用“”号&#xff0c;因为这样只是将指针指向了同一个地址&am…

简单讲解SDL 互斥锁和信号量

为了便于理解直接给例子去讲解 SDL_bool condition SDL_FALSE; SDL_mutex *lock; SDL_cond *cond;lock SDL_CreateMutex(); cond SDL_CreateCond(); . . Thread A: SDL_LockMutex(lock); while (!condition) { SDL_CondWait(cond, lock); } SDL_UnlockMutex(lock);Thread B:…

OpenAI GPT-4o - 介绍

本文翻译整理自&#xff1a; Hello GPT-4o https://openai.com/index/hello-gpt-4o/ 文章目录 一、关于 GPT-4o二、模型能力三、能力探索四、模型评估1、文本评价2、音频 ASR 性能3、音频翻译性能4、M3Exam 零样本结果5、视觉理解评估6、语言 tokenization 六、模型安全性和局限…

【汇编语言】多文件组织

【汇编语言】多文件组织 文章目录 【汇编语言】多文件组织前言一、8086拓展1.子程序的另外一种写法2.程序的多文件组织 总结 前言 本篇文章将讲到子程序的另一种写法&#xff0c;以及程序的多文件组织。 一、8086拓展 1.子程序的另外一种写法 初始的程序 在这里我们对比一下…