点作为分隔符
当消息被路由到@MessageMapping方法时,它们会与AntPathMatcher进行匹配。默认情况下,模式预期使用斜杠(/)作为分隔符。这是Web应用程序中的良好惯例,类似于HTTP URL。然而,如果你更习惯于消息传递的惯例,你可以改用点(.)作为分隔符。
以下示例展示了如何操作:
- Java
- Kotlin
- Xml
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
// ...
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setPathMatcher(new AntPathMatcher("."));
registry.enableStompBrokerRelay("/queue", "/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {
// ...
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
registry.setPathMatcher(AntPathMatcher("."))
registry.enableStompBrokerRelay("/queue", "/topic")
registry.setApplicationDestinationPrefixes("/app")
}
}
<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" path-matcher="pathMatcher">
<websocket:stomp-endpoint path="/stomp"/>
<websocket:stomp-broker-relay prefix="/topic,/queue" />
</websocket:message-broker>
<bean id="pathMatcher" class="org.springframework.util.AntPathMatcher">
<constructor-arg index="0" value="."/>
</bean>
</beans>
之后,控制器可以在@MessageMapping方法中使用点(.)作为分隔符,如下例所示:
- Java
- Kotlin
@Controller
@MessageMapping("red")
public class RedController {
@MessageMapping("blue.{green}")
public void handleGreen(@DestinationVariable String green) {
// ...
}
}
@Controller
@MessageMapping("red")
class RedController {
@MessageMapping("blue.{green}")
fun handleGreen(@DestinationVariable green: String) {
// ...
}
}
客户端现在可以向 /app/red.blue.green123 发送消息。
在前面的例子中,我们没有更改“broker relay”的前缀,因为这些前缀完全取决于外部消息代理(external message broker)。请参阅你所使用的代理的STOMP文档页面,以了解它对目标头部(destination header)支持哪些约定(conventions)。
另一方面,“简单代理”确实依赖于配置的PathMatcher,因此,如果您更改了分隔符,这一变化也会影响代理以及代理从消息中匹配订阅模式中目标地址的方式。