通过Spring框架的spring-messaging和spring-websocket模块,提供了对WebSocket上STOMP的支持。一但你添加了这些依赖项,你就可以像下面这个示例一样,通过WebSocket公开一个STOMP端点:
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
}
}
/portfolio
是WebSocket(或SockJS)客户端用于WebSocket握手的HTTP URL。- destination请求头的值以
/app
开头的STOMP消息将被路由到@Controller
类中@MessageMapping
注释的方法。 - 使用内置的消息代理进行订阅和广播,并将destination请求头的值以
/topic
或/queue
开头的消息路由到消息代理。
下面这个示例通过XML来配置endpoint:
<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哪种类型的destinations和前缀。
如果要从浏览器连接服务器,对于STOMP协议,你可以使用[stomp-js/stompjs](<https://github.com/stomp-js/stompjs>)
库,这是最活跃的JavaScript库。
以下示例代码是基于它:
const stompClient = new StompJs.Client({
brokerURL: 'ws://domain.com/portfolio',
onConnect: () => {
*// ...*
}
});
或者,如果您通过SockJS连接,您可以在服务器端使用registry.addEndpoint("/portfolio").withSockJS()
启用SockJS Fallback,并在JavaScript端,按照这些指令操作。
请注意,前面示例中的stompClient
不需要指定login
和passcode
消息头。即使这样做了,它们也会在服务器端被忽略(或者更确切地说,被覆盖)。有关身份验证的更多信息,请参见连接到代理和身份验证。
有关更多示例代码,请参见:
- Using WebSocket to build an interactive web application — a getting started guide.
- Stock Portfolio — a sample application.
- 使用WebSocket构建交互式Web应用程序 — 入门指南。
- 股票投资组合 — 示例应用程序。