此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

启用 STOMP

STOMP over WebSocket 支持在spring-messagingspring-websocket模块。拥有这些依赖项后,就可以公开 STOMP endpoint,如下例所示:spring-doc.cadn.net.cn

import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		config.setApplicationDestinationPrefixes("/app"); (2)
		config.enableSimpleBroker("/topic", "/queue"); (3)
	}
}
1 /portfolio是 WebSocket(或 SockJS)到的端点的 HTTP URL。 客户端需要连接以进行 WebSocket 握手。
2 目标报头以/app路由到@MessageMappingmethods 中的@Controller类。
3 使用内置的消息代理进行订阅和广播,以及 路由目标标头以/topic/queue到经纪人。

以下示例显示了与上述示例等效的 XML 配置:spring-doc.cadn.net.cn

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/websocket
		https://www.springframework.org/schema/websocket/spring-websocket.xsd">

	<websocket:message-broker application-destination-prefix="/app">
		<websocket:stomp-endpoint path="/portfolio" />
		<websocket:simple-broker prefix="/topic, /queue"/>
	</websocket:message-broker>

</beans>
对于内置的 simple broker,/topic/queue前缀没有任何特殊的 意义。它们只是区分 pub-sub 和 point-to-point 的约定 消息收发(即,多个订阅者与 1 个使用者)。当您使用外部代理时, 检查代理的 STOMP 页面以了解哪种类型的 STOMP 目标和 它支持的前缀。

要从浏览器进行连接,对于 STOMP,您可以使用stomp-js/stompjs哪个是最 积极维护的 JavaScript 库。spring-doc.cadn.net.cn

以下示例代码基于它:spring-doc.cadn.net.cn

const stompClient = new StompJs.Client({
       brokerURL: 'ws://domain.com/portfolio',
       onConnect: () => {
           // ...
       }
   });

或者,如果你通过 Sockjs 连接,你可以在服务器端启用 Sockjs 回退registry.addEndpoint("/portfolio").withSockJS()在 JavaScript 方面, 按照这些说明进行作。spring-doc.cadn.net.cn

请注意,stompClient在前面的示例中不需要指定loginpasscode头。即使这样做了,他们也会被忽略(或者更确切地说, overridden) 的有关身份验证的更多信息,请参见Connecting to a Broker and Authenticationspring-doc.cadn.net.cn

有关更多示例代码,请参阅:spring-doc.cadn.net.cn