Skip to content

简单代理

内置的简单消息代理(Simple Broker)处理来自客户端的订阅请求,并将它们存储在内存中,然后将消息广播给具有匹配目的地的已连接客户端。

该代理支持类似路径的目的地,包括对 Ant 风格模式的订阅。

配置心跳 (Heartbeats)

如果配置了任务调度器(Task Scheduler),简单代理支持 STOMP 心跳。你可以声明自己的 TaskScheduler Bean,或者通过 @Lazy 引用内置的:

java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

	private TaskScheduler messageBrokerTaskScheduler;

	@Autowired
	public void setMessageBrokerTaskScheduler(@Lazy TaskScheduler taskScheduler) {
		this.messageBrokerTaskScheduler = taskScheduler;
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.enableSimpleBroker("/queue/", "/topic/")
				.setHeartbeatValue(new long[] {10000, 20000}) // 发送间隔, 接收间隔 (毫秒)
				.setTaskScheduler(this.messageBrokerTaskScheduler);
	}
}
kotlin
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	private lateinit var messageBrokerTaskScheduler: TaskScheduler

	@Autowired
	fun setMessageBrokerTaskScheduler(@Lazy taskScheduler: TaskScheduler) {
		this.messageBrokerTaskScheduler = taskScheduler
	}

	override fun configureMessageBroker(registry: MessageBrokerRegistry) {
		registry.enableSimpleBroker("/queue/", "/topic/")
			.setHeartbeatValue(longArrayOf(10000, 20000))
			.setTaskScheduler(messageBrokerTaskScheduler)
	}
}

补充教学

1. 为什么它是“简单”代理?

  • 内存存储: 所有的订阅关系都存在内存里。如果服务器重启,所有订阅都会丢失(客户端需要重连)。
  • 单机限制: 它无法跨服务器共享订阅。如果你部署了多个应用实例,A 服务器无法给连接在 B 服务器上的客户端发消息。
  • 功能子集: 它不支持 STOMP 协议的所有特性(如消息确认 ACK 或收据 Receipt)。

2. 适用场景

它非常适合开发环境、原型演示,或者那些对高可用要求不高且能单机跑通的小型项目。

3. 注意点:不要与外部代理混淆

开启 enableSimpleBroker 仅仅是告诉 Spring 开启内部逻辑逻辑。如果你需要连接 RabbitMQ,应该使用 enableStompBrokerRelay

Based on Spring Framework.