0
点赞
收藏
分享

微信扫一扫

Spring STOMP-连接到消息代理

刘员外__ 2024-05-14 阅读 9
springjava

STOMP 代理中继维护一个与消息代理的“系统”TCP 连接。这个连接仅用于来自服务器端应用程序的消息,不用于接收消息。您可以为此连接配置STOMP凭据(即STOMP帧的loginpasscode头部)。这在XML命名空间和Java配置中都以systemLoginsystemPasscode属性的形式暴露,默认值均为guest

STOMP代理中继还为每个连接的WebSocket客户端创建一个单独的TCP连接。你可以配置用于代表客户端创建的所有TCP连接的STOMP凭据。这在XML命名空间和Java配置中都以clientLoginclientPasscode属性的形式暴露,默认值均为guest

STOMP代理中继还在“系统”TCP连接上向消息代理发送和接收心跳。你可以配置发送和接收心跳的时间间隔(默认为10秒)。如果与代理的连接丢失,代理中继会继续尝试重新连接,每5秒一次,直到成功。

任何Spring Bean都可以实现ApplicationListener<BrokerAvailabilityEvent>来接收,当到消息代理的“系统”连接丢失和重新建立时的通知。例如,一个广播股票报价的股票报价服务可以在没有活跃的“系统”连接时停止尝试发送消息。

默认情况下,STOMP代理中继始终保持连接,并在连接丢失时根据需要重新连接到相同的主机和端口。如果你希望提供多个地址,则在每次尝试连接时,你可以配置一个地址提供者,而不是固定的主机和端口。以下示例展示了如何做到这一点:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

	*// ...*@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.enableStompBrokerRelay("/queue/", "/topic/").setTcpClient(createTcpClient());
		registry.setApplicationDestinationPrefixes("/app");
	}

	private ReactorNettyTcpClient<byte[]> createTcpClient() {
		return new ReactorNettyTcpClient<>(
				client -> client.addressSupplier(() -> ... ),
				new StompReactorNettyCodec());
	}
}

你还可以使用virtualHost属性配置STOMP代理中继。该属性的值被设置为每个CONNECT帧的host 标头,这可能会很有用(例如,在云环境中,建立TCP连接的实际主机与提供基于云的STOMP服务的主机不同)。

举报

相关推荐

0 条评论