Spring STOMP-消息代理

简单的消息代理

内置的简单消息代理会处理来自客户端的订阅请求,将请求消息存储在内存中,并广播消息给匹配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文档(例如RabbitMQActiveMQ等),安装代理,启用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客户端广播消息。

实际上,代理中继实现了健壮且可扩展的消息广播。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值