Spring STOMP-STOMP客户端

Spring提供了一个基于WebSocket的STOMP客户端和一个基于TCP的STOMP客户端。

首先,你可以创建并配置WebSocketStompClient,如下所示:

WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new StringMessageConverter());
stompClient.setTaskScheduler(taskScheduler); *// for heartbeats*

在上述示例中,你可以将StandardWebSocketClient替换为SockJsClient,因为SockJsClient也是WebSocketClient的实现。SockJsClient可以使用WebSocket或HTTP作为后备传输。有关更多详细信息,请参见[SockJsClient](<https://docs.spring.io/spring-framework/reference/web/websocket/fallback.html#websocket-fallback-sockjs-client>)

接下来,你可以建立连接并为STOMP会话提供一个处理器,如下例所示:

String url = "ws://127.0.0.1:8080/endpoint";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(url, sessionHandler);

当会话准备好使用时,处理器会被通知,如下所示:

public class MyStompSessionHandler extends StompSessionHandlerAdapter {@Overridepublic void afterConnected(StompSession session, StompHeaders connectedHeaders) {*// ...*}
}

一旦会话建立,任何payload都可以通过配置的MessageConverter序列化后发出,如下所示:

session.send("/topic/something", "payload");

你还可以订阅destinations。subscribe方法需要一个用于订阅上的消息处理器,并返回一个Subscription句柄,你可以使用它来取消订阅。对于每个接收到的消息,处理器可以指定目标的Object类型,以将payload 反序列化为该类型,如下所示:

session.subscribe("/topic/something", new StompFrameHandler() {@Overridepublic Type getPayloadType(StompHeaders headers) {return String.class;}@Overridepublic void handleFrame(StompHeaders headers, Object payload) {*// ...*}});

要启用STOMP心跳检测,你可以在WebSocketStompClient 配置TaskScheduler,并可以自定义心跳间隔(默认情况下,写入不活动为 10 秒,这会导致发送心跳;读取不活动为 10 秒,这会关闭连接)。

WebSocketStompClient仅在不活跃时发送心跳,即当没有发送其他消息时。这在使用外部代理时可能会带来挑战,因为带有非代理destination 的消息代表活动,但实际并未转发到代理。在这种情况下,你可以在初始化外部代理时配置一个TaskScheduler,确保即使只发送带有非代理destination 的消息,心跳也会被转发到代理。

当你使用 WebSocketStompClient 进行性能测试以模拟同一台计算机上的数千个客户端时,请考虑关闭心跳,因为每个连接都会安排自己的心跳任务,并且对于在同一台计算机上运行的大量客户端而言,这并未进行优化。

STOMP协议还支持收据,客户端必须添加一个receipt 标头,服务器在处理完发送或订阅后,会响应RECEIPT帧。为此,StompSession提供了setAutoReceipt(boolean) 配置,它会在每个后续的发送或订阅事件上添加一个receipt头部。或者,你也可以手动向StompHeaders添加一个receipt 标头。发送和订阅方法都返回一个Receiptable实例,你可以使用它来注册收据成功和失败的回调。为此功能,你必须这客户端配置TaskScheduler,以及收据过期前的时间(默认为15秒)。

请注意,StompSessionHandler本身是一个 StompFrameHandler,除了用于消息处理异常的handleException回调和用于传输级错误(包括 ConnectionLostException)的handleTransportError之外,它还可以处理 ERROR 帧。

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

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

相关文章

【竞技宝】英超:滕哈格命真硬!足总杯夺冠获欧联资格

足总杯决赛结束,曼联爆冷2比1击败联赛冠军曼城夺冠,滕哈格再一次用顶级理解带队拿到杯赛冠军。赛前曼彻斯特当地有媒体爆料,曼联管理层已经决定要在足总杯决赛之后解雇滕哈格,这个消息让不少球迷都很担心滕哈格的状态。但是荷兰主帅凭借强大的内心,带领球队击败了不可一世的曼城…

如何在Java中创建不可变对象?

在Java中创建不可变对象是一个常见的编程实践&#xff0c;它有助于提高代码的可读性、可维护性和安全性。以下我将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细阐述如何在Java中创建不可变对象。 一、技术难点 在Java中创建不可变对象时&#xff0c;主要的…

买房送户口!多城加入“抢人大战”

业内人士认为&#xff0c;近期&#xff0c;多地推出的购房落户政策已区别于此前的人才落户政策&#xff0c;更聚焦于住房消费&#xff0c;降低了落户门槛&#xff0c;体现了各地对导入人口的重视&#xff0c;有利于人才流动&#xff0c;推动新型城镇化建设。 千万人口城市“后…

民宿推荐系统-手把手调试搭建

民宿推荐系统-手把手调试搭建 民宿推荐系统-手把手调试搭建

echarts配置记录,一些已经废弃的写法

1、normal&#xff0c;4.0以后无需将样式写在normal中了 改前&#xff1a; 改后&#xff1a; DEPRECATED: normal hierarchy in labelLine has been removed since 4.0. All style properties are configured in labelLine directly now. 2、axisLabel中的文字样式无需使用te…

文本处理工具grep及sed

文章目录 一、grep文本处理工具二、sed文本处理工具基本用法sed脚本格式搜索替代 一、grep文本处理工具 选项含义-color对匹配到的文本着色显示-m 次数匹配到规定的次数后停止-v显示不被命令匹配到的行,即取反-i忽略字符大小写-n显示匹配的行号-c统计匹配的行数-o仅显示匹配到…

log4j2远程代码执行

漏洞复现 漏洞复现2 这个框架不是web框架了&#xff0c;不是服务器web网站框架了&#xff0c;是java日志框架&#xff0c;就是记录日志信息&#xff0c;每一个程序都有一个日志文件&#xff0c;这个就是java里面记录日志的一个框架&#xff0c;它存在的点也是日志框架那几个代…

Java语言规范

Java程序的结构 package—0或1条&#xff0c;出现在程序最开始的地方 Import—0或1条&#xff0c;用于引入Java提供的API class—创建自定义的类&#xff0c;public修饰的class类的类名需要跟文件名完全保持一致 main方法—可执行Java程序的入口&#xff0c;具体介绍查看2.…

Flutter 中的 BackdropFilter 小部件:全面指南

Flutter 中的 BackdropFilter 小部件&#xff1a;全面指南 在Flutter中&#xff0c;BackdropFilter是一个用于创建模糊和颜色调整效果的高级小部件&#xff0c;它可以对组件背后的内容应用滤镜效果。这使得BackdropFilter非常适合实现如背景模糊、颜色混合等复杂的视觉效果。本…

[力扣题解] 463. 岛屿的周长

题目&#xff1a;463. 岛屿的周长 思路 深度优先搜索&#xff1b; 代码 Method 1 对于遍历到的一个地块&#xff0c;向四周探索&#xff0c;越界或者遇到海洋地块说明这条边需要统计&#xff1b; class Solution { private:int dir[4][2] {{1, 0}, {-1, 0}, {0, 1}, {0,…

请叙述Vue 中使用了哪些设计模式

在Vue中&#xff0c;使用了多种设计模式来构建其框架和组件系统&#xff0c;这些设计模式使得Vue具有高效、灵活和易于维护的特性。以下是Vue中常见的设计模式及其简要描述&#xff1a; MVVM&#xff08;Model-View-ViewModel&#xff09;模式&#xff1a; Vue.js是一个MVVM框架…

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

大家好&#xff0c;我是程序锅。 最近在modelscope上闲逛的时候&#xff0c;在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛&#xff0c;它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示&#xff08;其中0代表差评&#xff…

数据库漫谈-sybase

sybase就是“system”加“database”&#xff0c;代表着信息系统的底层。Sybase公司很早就推出了关系数据库产品&#xff08;1987年5月推出的Sybase SQLServer1.0&#xff09;。Sybase也是第一个提出Client/Server 体系结构的思想&#xff0c;并率先在Sybase SQLServer 中实现。…

Go 和 Delphi 定义可变参数函数的对比

使用可变参数函数具有灵活性、重用性、简化调用等优点&#xff0c;各个语言有各自定义可变参数函数的方法&#xff0c;也有通用的处理方法&#xff0c;比如使用数组、定义参数结构体、使用泛型等。 这里总结记录一下 go、delphi 的常用的定义可变参数函数的方式&#xff01; 一…

基于图卷积网络的人体3D网格分割

深度学习在 2D 视觉识别任务上取得了巨大成功。十年前被认为极其困难的图像分类和分割等任务&#xff0c;现在可以通过具有类似人类性能的神经网络来解决。这一成功归功于卷积神经网络 (CNN)&#xff0c;它取代了手工制作的描述符。 NSDT工具推荐&#xff1a; Three.js AI纹理开…

1301-习题1-1高等数学

1. 求下列函数的自然定义域 自然定义域就是使函数有意义的定义域。 常见自然定义域&#xff1a; 开根号 x \sqrt x x ​&#xff1a; x ≥ 0 x \ge 0 x≥0自变量为分式的分母 1 x \frac{1}{x} x1​&#xff1a; x ≠ 0 x \ne 0 x0三角函数 tan ⁡ x cot ⁡ x \tan x \cot x …

C++奇迹之旅:vector使用方法以及操作技巧

文章目录 &#x1f4dd;前言&#x1f320; 熟悉vector&#x1f309;使用vector &#x1f320;构造函数&#x1f309;vector遍历 &#x1f320;operator[]&#x1f309;迭代器 &#x1f320;Capacity容量操作&#x1f309; size()&#x1f309; capacity()&#x1f309;resize()…

Vue生命周期钩子是如何实现的

Vue的生命周期钩子是在Vue组件创建、挂载、更新、销毁等过程中自动调用的特殊函数。这些钩子允许开发者在组件的不同阶段执行特定的逻辑。Vue 2 和 Vue 3 在生命周期钩子上有一些差异&#xff0c;主要是因为Vue 3引入了Composition API和更现代的JavaScript特性。 Vue 2 的生命…

C语言中的七种常用排序

今天&#xff0c;为大家整理了C语言中几种常用的排序&#xff0c;以及他们在实际中的运用&#xff08;有Bug请在下方评论&#xff09;&#xff1a; 一.桶排序 #include <stdio.h> int main() {int book[1001],i,j,t,n;for(i0;i<1000;i)book[i]0;scanf("%d"…