简单的消息代理
内置的简单消息代理会处理来自客户端的订阅请求,将请求消息存储在内存中,并广播消息给匹配destination的连接客户端。代理支持路径式destination,包括订阅Ant风格的destinations模式。
应用程序也可以使用点分隔(而不是斜线分隔)的destinations。见点作为分隔符章节。
如果配置了任务调度器,简单代理就能支持STOMP心跳检测。要配置调度器,你可以声明自己的TaskScheduler
bean,并通过MessageBrokerRegistry
设置上它。或者,你可以使用内置的WebSocket配置中自动声明的那个,但是你需要@Lazy
来避免内置WebSocket配置和你的WebSocketMessageBrokerConfigurer
之间的循环。例如:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
private TaskScheduler messageBrokerTaskScheduler;
@Autowired
public void setMessageBrokerTaskScheduler(@Lazy TaskScheduler taskScheduler) {
this.messageBrokerTaskScheduler = taskScheduler;
}
@Override
public 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 {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio").withSockJS();
}
@Override
public 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客户端广播消息。
实际上,代理中继实现了健壮且可扩展的消息广播。