简单代理
内置的简单消息代理(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。