基于Spring Boot,一步步教你用Websockets和STOMP进行消息推送
创始人
2025-07-09 09:21:40
0

1 引言

推送通知是一种实时消息传递形式,通过它网站可以向用户实时通知特定事件。通常使用WebSockets实现推送通知,这种技术提供了客户端和服务器之间的双向通信,从而实现了实时消息的处理。

本文使用WebSockets来实现推送通知,并使用STOMP协议在客户端和服务器之间进行通信。

2 什么是STOMP

STOMP代表简单文本导向的消息协议(Simple Text Oriented Messaging Protocol)。由于WebSockets是一种低级协议,使用帧(frames)来传输数据,而STOMP是一种高级协议,定义了如何解释某些帧类型中的数据。这些帧类型包括CONNECT、SEND、ACK等。因此,使用STOMP能够更加简化使用WebSockets进行数据的发送、接收和解析过程。

有了这个基础,接下来创建服务器应用程序。

3 创建一个应用程序

到https://start.spring.io创建一个Spring Boot应用程序,并添加以下依赖项:

Spring Boot Starter Websockets

现在,使用一个嵌入式消息代理,它将是一个提供WebSocket功能的内存中代理。给代理添加一些目的地。这些目的地指的是将要发送消息的路径。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/all","/specific");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/ws");
         registry.addEndpoint("/ws").withSockJS();
    }
}

在第一部分中,启用了一个带有两个目的地(/all和/specific)的代理。/all目的地将用于向所有用户发送通知,/specific目的地用于向特定用户发送通知。

接下来,设置应用程序的目的地,即 /app,这样就可以向应用程序发送信息了。

在第二部分中,注册了STOMP端点。其中一个启用了SockJS,另一个仅使用WebSocket。之所以这样做,是因为并非所有浏览器都支持WebSocket,当不可用时,可以回退到使用SockJS。

4 向所有用户发送推送通知

先看一下第一个用例,即向所有用户发送推送通知。

为此,首先实现一个控制器,该控制器会把来自一个客户端的信息转发给所有客户端。

@org.springframework.stereotype.Controller
public class Controller {

    @Autowired
    SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/application")
    @SendTo("/all/messages")
    public Message send(final Message message) throws Exception {
        return message;
    }
}

在上面的代码中,我们接受/application端点上的消息。这实际上是之前定义的应用程序目的地/app的子目的地。这意味着客户端必须把消息发送到/app/application目的地才能到达该处理程序。

接下来,把传入的消息转发到/all/messages。现在,订阅该目的地的所有客户端都将收到发送给所有客户端的消息。

来看看HTML页面上的客户端代码: