对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

消息流

一旦 STOMP 端点被公开,Spring 应用程序就会成为连接的客户端的 STOMP 代理。本节描述服务器端的消息流。spring-doc.cadn.net.cn

spring-messaging模块包含对消息传递应用程序的基础支持起源于 Spring Integration,并且是后来被提取并合并到 Spring 框架中,以便在许多 Spring 项目和应用程序场景中更广泛地使用。以下列表简要描述了一些可用的消息传递抽象:spring-doc.cadn.net.cn

Java 配置(即@EnableWebSocketMessageBroker) 和 XML 命名空间配置(即,<websocket:message-broker>) 使用上述组件来组装消息工作流。下图显示了启用简单内置消息broker 时使用的组件:spring-doc.cadn.net.cn

消息流简单代理

上图显示了三个消息通道:spring-doc.cadn.net.cn

下图显示了当外部代理(例如 RabbitMQ)配置用于管理订阅和广播消息时使用的组件:spring-doc.cadn.net.cn

消息流代理中继

前两个图之间的主要区别在于使用“代理中继”来传递消息通过 TCP 向上传递到外部 STOMP 代理,以及从代理向下传递消息到订阅的客户端。spring-doc.cadn.net.cn

当从 WebSocket 连接接收到消息时,它们会被解码为 STOMP 帧,变成一个 SpringMessage表示,并发送到clientInboundChannel以进行进一步处理。例如,其destination 标头以/app可以路由到@MessageMapping方法带注释的控制器,而/topic/queue消息可以直接路由到消息代理。spring-doc.cadn.net.cn

一个带注释的@Controller处理来自客户端的 STOMP 消息的消息可以将消息发送到消息代理通过brokerChannel,并且代理通过消息广播给匹配的订阅者clientOutboundChannel. 一样 控制器也可以执行相同的作来响应 HTTP 请求,因此客户端可以执行HTTP POST,然后执行@PostMapping方法可以向消息代理发送消息以广播到订阅的客户端。spring-doc.cadn.net.cn

我们可以通过一个简单的示例来跟踪流程。考虑以下设置服务器的示例:spring-doc.cadn.net.cn

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.setApplicationDestinationPrefixes("/app");
		registry.enableSimpleBroker("/topic");
	}
}

@Controller
public class GreetingController {

	@MessageMapping("/greeting")
	public String handle(String greeting) {
		return "[" + getTimestamp() + ": " + greeting;
	}
}

前面的示例支持以:spring-doc.cadn.net.cn

  1. 客户端连接到localhost:8080/portfolio并且,一旦 WebSocket 连接建立,STOMP 帧开始在其上流动。spring-doc.cadn.net.cn

  2. 客户端发送目标标头为/topic/greeting. 收到并解码后,消息将发送到clientInboundChannel然后路由到消息代理,它存储客户端订阅。spring-doc.cadn.net.cn

  3. 客户端将 SEND 帧发送到/app/greeting. 这/app前缀有助于将其路由到带注释的控制器。之后/app前缀被剥离,其余的/greeting目标的一部分映射到@MessageMapping方法GreetingController.spring-doc.cadn.net.cn

  4. GreetingController变成了弹簧Message跟 基于返回值的有效负载和默认目标标头/topic/greeting(派生自输入目标,其中/app替换为/topic).生成的消息被发送到brokerChannel并处理 由消息代理。spring-doc.cadn.net.cn

  5. 消息代理查找所有匹配的订阅者,并向每个订阅者发送一个 MESSAGE 帧 通过clientOutboundChannel,消息从中编码为 STOMP 帧 并在 WebSocket 连接上发送。spring-doc.cadn.net.cn

下一节提供了有关注释方法的更多详细信息,包括 支持的参数和返回值类型。spring-doc.cadn.net.cn