简单的消息代理
内置的简单消息代理会处理来自客户端的订阅请求,将请求消息存储在内存中,并广播消息给匹配destination的连接客户端。代理支持路径式destination,包括订阅Ant风格的destinations模式。
应用程序也可以使用点分隔(而不是斜线分隔)的destinations。见点作为分隔符章节。
如果配置了任务调度器,简单代理就能支持STOMP心跳检测。要配置调度器,你可以声明自己的TaskScheduler
bean,并通过MessageBrokerRegistry
设置上它。或者,你可以使用内置的WebSocket配置中自动声明的那个,但是你需要@Lazy
来避免内置WebSocket配置和你的WebSocketMessageBrokerConfigurer
之间的循环。例如:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {private TaskScheduler messageBrokerTaskScheduler;@Autowiredpublic void setMessageBrokerTaskScheduler(@Lazy TaskScheduler taskScheduler) {this.messageBrokerTaskScheduler = taskScheduler;}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/queue/", "/topic/").setHeartbeatValue(new long[] {10000, 20000}).setTaskScheduler(this.messageBrokerTaskScheduler);*// ...*}
}
外部消息代理服务
简单代理适合入门学习,但它仅支持STOMP命令的子集(它不支持acks、receipts和其他一些特性),依赖于一个简单的消息发送循环,并且不适合集群环境。作为替代方案,你可以升级你的应用程序来使用一个完整功能的消息代理。
请查看你选择的消息代理的STOMP文档(例如RabbitMQ、ActiveMQ等),安装代理,启用STOMP的支持,并运行它。然后你可以在Spring配置中启用STOMP代理中继(而不是简单代理)。
以下示例配置启用了一个完整功能的代理:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/portfolio").withSockJS();}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableStompBrokerRelay("/topic", "/queue");registry.setApplicationDestinationPrefixes("/app");}}
下面是XML的配置方式,它的效果和java配置方式一样:
<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:sockjs/></websocket:stomp-endpoint><websocket:stomp-broker-relay prefix="/topic,/queue" /></websocket:message-broker></beans>
在前面的配置中,STOMP代理中继是一个Spring的 MessageHandler
,它通过将消息转发到外部消息代理来处理消息。为此,它建立到消息代理的TCP连接,将所有消息转发给代理,然后将从代理收到的消息通过WebSocket会话转发给客户端。本质上,它充当了一个“中继”,在两个方向上转发消息。
为了管理TCP连接,需要在你的项目中添加io.projectreactor.netty:reactor-netty和io.netty:netty-all依赖。
此外,应用程序(如HTTP请求处理方法、业务服务等)也可以直接向代理中继发送消息,如发送消息一节中所述,通过这种方式向订阅的WebSocket客户端广播消息。
实际上,代理中继实现了健壮且可扩展的消息广播。