Dots as Separators

当消息被路由到 @MessageMapping 方法时,它们与 AntPathMatcher 匹配。默认情况下,模式会使用斜杠 (/) 作为分隔符。在 Web 应用程序中,这是一个很好的约定,类似于 HTTP URL。然而,如果您更习惯于消息传递约定,您可以切换到使用点 (.)作为分隔符。

When messages are routed to @MessageMapping methods, they are matched with AntPathMatcher. By default, patterns are expected to use slash (/) as the separator. This is a good convention in web applications and similar to HTTP URLs. However, if you are more used to messaging conventions, you can switch to using dot (.) as the separator.

以下示例演示了如何执行此操作:

The following example shows how to do so:

  • 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 方法中使用点 (.)作为分隔符,如下面的示例所示:

After that, a controller can use a dot (.) as the separator in @MessageMapping methods, as the following example shows:

  • 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 发送消息。

The client can now send a message to /app/red.blue.green123.

在前面的示例中,我们没有更改 “代理中继” 的前缀,因为它们完全取决于外部消息代理。请参阅您使用的代理的 STOMP 文档页面,以查看它支持哪些目标标头的约定。

In the preceding example, we did not change the prefixes on the “broker relay”, because those depend entirely on the external message broker. See the STOMP documentation pages for the broker you use to see what conventions it supports for the destination header.

另一方面,“简单代理” 确实依赖于配置的 PathMatcher,因此,如果您切换分隔符,该更改也会应用到代理,以及代理将消息中的目标与订阅中的模式进行匹配的方式。

The “simple broker”, on the other hand, does rely on the configured PathMatcher, so, if you switch the separator, that change also applies to the broker and the way the broker matches destinations from a message to patterns in subscriptions.