Enable STOMP

WebSocket支持的STOMP在`spring-messaging`和`spring-websocket`模块中可用。有了这些依赖项后,你可以在WebSocket上公开STOMP端点,如下例所示:

STOMP over WebSocket support is available in the spring-messaging and spring-websocket modules. Once you have those dependencies, you can expose a STOMP endpoint over WebSocket, as the following example shows:

  • Java

  • Kotlin

  • Xml

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		// /portfolio is the HTTP URL for the endpoint to which a WebSocket (or SockJS)
		// client needs to connect for the WebSocket handshake
		registry.addEndpoint("/portfolio");
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		// STOMP messages whose destination header begins with /app are routed to
		// @MessageMapping methods in @Controller classes
		config.setApplicationDestinationPrefixes("/app");
		// Use the built-in message broker for subscriptions and broadcasting and
		// route messages whose destination header begins with /topic or /queue to the broker
		config.enableSimpleBroker("/topic", "/queue");
	}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	override fun registerStompEndpoints(registry: StompEndpointRegistry) {
		// /portfolio is the HTTP URL for the endpoint to which a WebSocket (or SockJS)
		// client needs to connect for the WebSocket handshake
		registry.addEndpoint("/portfolio")
	}

	override fun configureMessageBroker(config: MessageBrokerRegistry) {
		// STOMP messages whose destination header begins with /app are routed to
		// @MessageMapping methods in @Controller classes
		config.setApplicationDestinationPrefixes("/app")
		// Use the built-in message broker for subscriptions and broadcasting and
		// route messages whose destination header begins with /topic or /queue to the broker
		config.enableSimpleBroker("/topic", "/queue")
	}
}
<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>

对于内置简单代理,/topic/queue 前缀没有任何特殊含义。它们仅是一种约定,用于区分发布-订阅消息与点到点消息(即,多个订阅者与一个使用者)。当您使用外部代理时,请查看代理的 STOMP 页面,以了解它支持哪种 STOMP 目标和前缀。

For the built-in simple broker, the /topic and /queue prefixes do not have any special meaning. They are merely a convention to differentiate between pub-sub versus point-to-point messaging (that is, many subscribers versus one consumer). When you use an external broker, check the STOMP page of the broker to understand what kind of STOMP destinations and prefixes it supports.

要从浏览器进行连接,对于STOMP,你可以使用 link:https://github.com/stomp-js/stompjs[stomp-js/stompjs,这是维护最活跃的JavaScript库。

To connect from a browser, for STOMP, you can use stomp-js/stompjs which is the most actively maintained JavaScript library.

以下示例代码基于它:

The following example code is based on it:

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

或者,如果你通过 SockJS 连接,可以在服务端通过 `registry.addEndpoint("/portfolio").withSockJS()`启用 SockJS Fallback,并通过执行 those instructions在 JavaScript 端启用。

Alternatively, if you connect through SockJS, you can enable the SockJS Fallback on server-side with registry.addEndpoint("/portfolio").withSockJS() and on JavaScript side, by following those instructions.

请注意,在上述示例中,`stompClient`无需指定 `login`和 `passcode`标题。如果确实指定,它们将在服务端被忽略(或更准确地说,被覆盖)。请参阅 Connecting to a BrokerAuthentication以了解有关身份验证的更多信息。

Note that stompClient in the preceding example does not need to specify login and passcode headers. Even if it did, they would be ignored (or, rather, overridden) on the server side. See Connecting to a Broker and Authentication for more information on authentication.

有关更多示例代码,请参阅:

For more example code see: