STOMP协议和在Spring MVC的WebSocket使用

STOMP协议和在Spring MVC的WebSocket使用

介绍

STOMP允许消息客户端(生产者、消费者)与任意消息代理(Broker)之间进行异步消息传输的简单文本定向消息协议。但STOMP并不是为WebSocket而设计的,它是属于消息队列的一种协议(AMQP、JMS等都属于消息队列协议)。许多消息队列都支持STOMP协议(例如:RabbitMQ、ActiveMQ)。由于它的简单性,因此可以用于定义websocket的消息体格式。我们先建立了webscoket连接, 接下来我只需要在webscoket连接的基础上建立stomp连接,因此STOMP协议格式的消息就会写入到websocket的payload中。

WebSocket内容很混乱,stomp对其内容进行了规范化。stomp不止可以在websocket上使用,也可以在http中使用。
stomp是一种规范,而stomp的包是对这种规范的解析
WebSocket基础上stomp(简单的文本传输协议)
stomp 一般用于消息中心,消息分成发布(服务端)和订阅(客户端)
而消息订阅(支持在线和离线)推送

ChatGPT回答:

STOMP(Simple Text Oriented Messaging Protocol)是一种简单文本定向的消息协议,通常用于在Web应用程序之间进行实时的双向通信。STOMP设计的目的是提供一个简单而灵活的协议,使得支持不同编程语言的客户端和消息代理(如消息中间件)能够进行异步消息传递。

以下是一些关键特点和概念:

  1. 简单性: STOMP被设计为一种轻量级的协议,易于理解和实现。它使用简单的文本命令和标头来传递消息。

  2. 文本导向: STOMP消息是以文本形式传递的,这使得它对于人类来说更易读,并且也方便调试。

  3. 协议中立性: STOMP是一种协议中立的消息协议,这意味着它可以在多种不同的消息代理上使用,而不受限于特定的消息中间件。

  4. 异步通信: STOMP支持异步通信,允许客户端通过订阅主题(topics)或队列(queues)接收实时消息。

  5. WebSocket支持: STOMP可以在WebSocket上运行,使得它成为Web应用程序中实时通信的理想选择。

  6. 基于帧(Frame): STOMP消息通过帧进行传递,帧包括命令、标头和正文。常见的命令包括 CONNECT、SEND、SUBSCRIBE、UNSUBSCRIBE、BEGIN、COMMIT、ABORT、ACK、NACK、DISCONNECT 等。

在Web开发中,STOMP通常与WebSocket一起使用,以实现实时、双向的通信。Spring框架提供了对STOMP协议的支持,通过Spring WebSocket模块可以轻松地在Spring应用程序中使用STOMP。

笔记

信息中心(信息推送)broker:子模块
消息订阅
可以离线或者在线
消息的发布(服务端)和订阅(客户端)
WsSocket基础上stomp(简单的文本传输协议)

消息通讯stomp
如果想要使用spring的消息代理,则添加以下依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>5.3.23</version>
</dependency>

需要导入js包,解析对象

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>
@Configuration
/**
 * 启用WebSocket消息代理中间件
 */
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    /**
     * 注册一个连接消息中间件(路径url)
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 在给定的映射路径上通过WebSocket注册STOMP端点。
        registry.addEndpoint("broker");
    }

    /**
     * 配置消息代理,主要是设置相关的主题
     * 消息代理的服务中心的核心,Spring webSocket内置了一个简单的消息代理,但也只是能够满足基本要求,如果需要强大的消息中心功能,通常都会集成第三方的消息队列,例如:RabbitMQ等
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 启用spring内置简单的消息代理并设置一个主题(topic)前缀
        // 用于消息的发布和订阅

        // 启用简单的消息代理
        registry.enableSimpleBroker("/news","/video");
        // 启用第三方的消息代理(集成外部其他的消息代理)
//        registry.enableStompBrokerRelay();
    }
}