对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
消息流
一旦 STOMP 端点被公开,Spring 应用程序就会成为连接的客户端的 STOMP 代理。本节描述服务器端的消息流。
这spring-messaging
模块包含对消息传递应用程序的基础支持起源于 Spring Integration,并且是后来被提取并合并到 Spring 框架中,以便在许多 Spring 项目和应用程序场景中更广泛地使用。以下列表简要描述了一些可用的消息传递抽象:
-
消息:消息的简单表示形式,包括标头和有效负载。
-
消息处理程序:用于处理消息的合约。
-
消息通道:用于发送消息的合约,该消息使生产者和消费者之间能够松散耦合。
-
SubscribableChannel:
MessageChannel
跟MessageHandler
用户。 -
ExecutorSubscribableChannel:
SubscribableChannel
使用Executor
用于传递消息。
Java 配置(即@EnableWebSocketMessageBroker
) 和 XML 命名空间配置(即,<websocket:message-broker>
) 使用上述组件来组装消息工作流。下图显示了启用简单内置消息broker 时使用的组件:

上图显示了三个消息通道:
-
clientInboundChannel
:用于传递从 WebSocket 客户端接收的消息。 -
clientOutboundChannel
:用于向 WebSocket 客户端发送服务器消息。 -
brokerChannel
:用于从服务器端应用程序代码中向消息代理发送消息。
下图显示了当外部代理(例如 RabbitMQ)配置用于管理订阅和广播消息时使用的组件:

前两个图之间的主要区别在于使用“代理中继”来传递消息通过 TCP 向上传递到外部 STOMP 代理,以及从代理向下传递消息到订阅的客户端。
当从 WebSocket 连接接收到消息时,它们会被解码为 STOMP 帧,变成一个 SpringMessage
表示,并发送到clientInboundChannel
以进行进一步处理。例如,其destination 标头以/app
可以路由到@MessageMapping
方法带注释的控制器,而/topic
和/queue
消息可以直接路由到消息代理。
一个带注释的@Controller
处理来自客户端的 STOMP 消息的消息可以将消息发送到消息代理通过brokerChannel
,并且代理通过消息广播给匹配的订阅者clientOutboundChannel
. 一样 控制器也可以执行相同的作来响应 HTTP 请求,因此客户端可以执行HTTP POST,然后执行@PostMapping
方法可以向消息代理发送消息以广播到订阅的客户端。
我们可以通过一个简单的示例来跟踪流程。考虑以下设置服务器的示例:
@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;
}
}
前面的示例支持以:
-
客户端连接到
localhost:8080/portfolio
并且,一旦 WebSocket 连接建立,STOMP 帧开始在其上流动。 -
客户端发送目标标头为
/topic/greeting
. 收到并解码后,消息将发送到clientInboundChannel
然后路由到消息代理,它存储客户端订阅。 -
客户端将 SEND 帧发送到
/app/greeting
. 这/app
前缀有助于将其路由到带注释的控制器。之后/app
前缀被剥离,其余的/greeting
目标的一部分映射到@MessageMapping
方法GreetingController
. -
从
GreetingController
变成了弹簧Message
跟 基于返回值的有效负载和默认目标标头/topic/greeting
(派生自输入目标,其中/app
替换为/topic
).生成的消息被发送到brokerChannel
并处理 由消息代理。 -
消息代理查找所有匹配的订阅者,并向每个订阅者发送一个 MESSAGE 帧 通过
clientOutboundChannel
,消息从中编码为 STOMP 帧 并在 WebSocket 连接上发送。
下一节提供了有关注释方法的更多详细信息,包括 支持的参数和返回值类型。