springboot集成stomp websocket基于rabbitmq消息代理实现

本文档介绍了如何使用SpringBoot结合RabbitMQ作为消息代理实现WebSocket STOMP通信。内容涵盖RabbitMQ的安装配置、STOMP代理前缀、依赖配置、消息持久化以及消息应答机制等关键步骤,旨在帮助开发者理解如何在实际项目中部署和使用这一技术栈。
摘要由CSDN通过智能技术生成

准备

 简单的代理非常适合入门但仅支持STOMP命令的子集(例如,不支持acks, receipts等),依赖于简单的消息发送循环,并且不适合于群集。作为替代方案,应用程序可以升级到使用功能齐全的消息代理。本文将以rabbitmq作为外部消息代理实现,首先安装RabbitMQ并启动rabbitmq_web_stomp插件。

  • 在rabbitMQ上执行如下命令:sudo rabbitmq-plugins enable rabbitmq_web_stomp
  • 登录RabbitMQ管理平台,看到如下信息,发现已经开启stomp代理服务

架构图

上图与简单消息代理结构中的主要区别是使用“代理中继-StompBrokerRelay"通过TCP将消息传递到外部STOMP代理,以及将消息从代理传递到订阅的客户端。此外,应用程序组件(例如,HTTP请求处理方法,业务服务等)也可以向代理中继或者外部消息代理发送消息,以便向订阅的WebSocket客户端广播消息。

添加依赖

<dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-net</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>io.projectreactor.ipc</groupId>
    <artifactId>reactor-netty</artifactId>
</dependency>
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
</dependency>

外部消息代理配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig4Stomp implements WebSocketMessageBrokerConfigurer {
	
	/**
	 * @param registry
	 */
	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/stomp") // 设置websocket端点
			.setAllowedOrigins("*") // 允许跨域请求
			.setHandshakeHandler(clientHandshakeHandler())
			.addInterceptors(clientHandshakeInterceptor())
			.withSockJS();// 指定使用SockJS协议
	}
	
	/**
	 * 配置外部消息代理
         *
	 * @param registry
	 */
	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		// rabbitmq合法的目的前缀:/temp-queue, /exchange, /topic, /queue, /amq/queue, /reply-queue/
		registry.enableStompBrokerRelay("/topic", "/queue", "/amq/queue", "/exchange") // 配置消息代理前缀
		.setRelayHost(host) // 配置消息代理服务器.默认:127.0.0.1
		.setRelayPort(port) // 配置代理服务器端口.默认:61613
		.setClientLogin(username).setClientPasscode(password) // 配置每个客户端的连接认证信息.默认:guest/guest
		.setSystemLogin(username).setSystemPasscode(password) // 源自服务端的连接的认证信息.默认:guest/guest
		.setUserRegistryBroadcast("/topic/simp-user-registry")// 当有用户注册时将其广播到其他服务器
		.setUserDestinationBroadcast("/topic/unresolved-user-destination")// 将当前服务端点无法发送到user dest的消息广播到其他服务端点处理
		.setSystemHeartbeatReceiveInterval(15000) // 配置服务端session接收stomp消息代理心跳时间间隔(0代表不接收)
		.setSystemHeartbeatSendInterval(15000); // 配置服务端session向stomp消息代理发送心跳时间间隔(0代表不接收)
		// 配置服务端接收消息的地址前缀与@MessageMapping路径组合使用
		registry.setApplicationDestinationPrefixes("/app");
		// 配置点对点使用的订阅前缀,默认是"/user" 例如:(@link org.springframework.messaging.simp.user.DefaultUserDestinationResolver)
		// 客户端订阅:/user/queue/message
		// 服务器推送指定用户:/user/{userId}/queue/message
		registry.setUserDestinationPrefix("/user");
	}
}

上述配置中的“STOMP代理中继”是StompBrokerRelayMessageHandler,它通过将消息转发到外部消息代理来处理消息。为此,它建立到外部消息代理的TCP连接,将所有消息转发给它,然后通过其WebSocket会话将从代理接收的所有消息转发给客户端。从本质上讲,它充当“转发”,可以在两个方向上转发消息。

对于每个新的客户端的CONNECT消息,STOMP代理中继-StompBrokerRelayMessageHandler将打开与外部消息代理的独立TCP连接,并专门用于处理来自发起CONNECT消息的客户端的所有消息。来自同一客户端的消息通过会话ID消息头标识。 相反,当STOMP代理在TCP连接上发回消息时,这些消息将会带有客户端的会话ID,并通过提供给构造函数的MessageChannel向下游发送。

StompBrokerRelayMessageHandler还会自动打开与外部消息代理的默认“system”TCP连接,用于发送源自服务器应用程序的消息(而不是来自客户端)。此类消息不与任何客户端关联,因此没有会话ID标头。 “system”TCP连接实际上是共享的,不能用于接收消息。spring提供了几个属性来配置“system”连接,包括:setSystemLogin、setSy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值