STOMP 消息
目的地、订阅、MessageMapping。
35 分钟
STOMP 消息
STOMP(Simple Text Oriented Messaging Protocol)在 WebSocket 之上提供 目的地、订阅、广播 语义。CodeRoadMap 实验台聊天室推荐 STOMP,而非手写 JSON 路由。
学习目标
- 配置
enableSimpleBroker与@MessageMapping - 理解
/topicvs/queuevs/app前缀 - 用
@SendTo向订阅者广播
Broker 配置
@Configuration
@EnableWebSocketMessageBroker
public class StompConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*")
.withSockJS(); // 降级兼容,生产可关
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
}
- 客户端 订阅
/topic/lab.{sessionId} - 客户端 发送 到
/app/chat.send
控制器
@Controller
public class LabChatController {
@MessageMapping("/chat.send")
@SendTo("/topic/lab.{sessionId}")
public ChatMessage send(@Payload ChatMessage msg,
@Header("sessionId") String sessionId) {
return msg; // 广播给该实验间所有订阅者
}
}
REST 仍负责创建 sessionId(POST /api/lab/sessions);STOMP 只推送 进行中 的消息。
客户端订阅(概念)
stompClient.subscribe(`/topic/lab.${sessionId}`, (frame) => {
const msg = JSON.parse(frame.body);
});
stompClient.publish({ destination: "/app/chat.send", body: JSON.stringify(msg) });
完整浏览器代码见 ws-client。
练习
- 画出发送一条聊天消息经过
/app→ Controller →/topic的路径 - 解释
/queue适合点对点通知的场景 - 对照 理解跨实例广播