ブローカーへの接続

STOMP ブローカーリレーは、ブローカーへの単一の「システム」TCP 接続を維持します。この接続は、サーバー側アプリケーションから発信されたメッセージにのみ使用され、メッセージの受信には使用されません。この接続の STOMP 資格情報(つまり、STOMP フレーム login および passcode ヘッダー)を構成できます。これは、XML 名前空間と Java 構成の両方で、guest と guest のデフォルト値を持つ systemLogin と systemPasscode プロパティとして公開されます。

STOMP ブローカーリレーは、接続された WebSocket クライアントごとに個別の TCP 接続も作成します。クライアントに代わって作成されるすべての TCP 接続に使用される STOMP 資格情報を構成できます。これは、XML 名前空間と Java 構成の両方で、guest と guest のデフォルト値を持つ clientLogin と clientPasscode プロパティとして公開されます。

STOMP ブローカーリレーは、クライアントに代わってブローカーに転送するすべての CONNECT フレームに、常に login および passcode ヘッダーを設定します。WebSocket クライアントはこれらのヘッダーを設定する必要はありません。それらは無視されます。認証セクションで説明しているように、WebSocket クライアントは、代わりに HTTP 認証に依存して WebSocket エンドポイントを保護し、クライアント ID を確立する必要があります。

STOMP ブローカーリレーは、「システム」TCP 接続を介してメッセージブローカーとの間でハートビートを送受信します。ハートビートを送信および受信する間隔を構成できます(デフォルトではそれぞれ 10 秒)。ブローカーへの接続が失われた場合、ブローカーリレーは、成功するまで 5 秒ごとに再接続を試行し続けます。

Spring Bean は、ApplicationListener<BrokerAvailabilityEvent> を実装して、ブローカーへの「システム」接続が失われ、再確立されたときに通知を受信できます。例: 株価をブロードキャストする株価サービスは、アクティブな「システム」接続がない場合にメッセージの送信を停止できます。

デフォルトでは、STOMP ブローカーリレーは常に同じホストとポートに接続し、接続が失われた場合は必要に応じて再接続します。複数のアドレスを提供する場合、接続を試みるたびに、固定ホストとポートの代わりにアドレスのサプライヤーを構成できます。次の例は、その方法を示しています。

  • Java

  • Kotlin

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

	// ...

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

	private ReactorNettyTcpClient<byte[]> createTcpClient() {
		return new ReactorNettyTcpClient<>(
				client -> client.remoteAddress(() -> new InetSocketAddress(0)),
				new StompReactorNettyCodec());
	}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {

	// ...

	override fun configureMessageBroker(registry: MessageBrokerRegistry) {
		registry.enableStompBrokerRelay("/queue/", "/topic/").setTcpClient(createTcpClient())
		registry.setApplicationDestinationPrefixes("/app")
	}

	private fun createTcpClient(): ReactorNettyTcpClient<ByteArray> {
		return ReactorNettyTcpClient({ it.addressSupplier { InetSocketAddress(0) } }, StompReactorNettyCodec())
	}
}

virtualHost プロパティを使用して STOMP ブローカーリレーを構成することもできます。このプロパティの値は、すべての CONNECT フレームの host ヘッダーとして設定されており、有用な場合があります(たとえば、TCP 接続が確立される実際のホストがクラウドベースの STOMP サービスを提供するホストと異なるクラウド環境で)。