外部ブローカー

シンプルなブローカーは開始に最適ですが、STOMP コマンドのサブセットのみをサポートし(ACK、受信、その他の機能はサポートしていません)、シンプルなメッセージ送信ループに依存しており、クラスタリングには適していません。別の方法として、フル機能のメッセージブローカーを使用するようにアプリケーションをアップグレードできます。

選択したメッセージブローカー(RabbitMQ (英語) ActiveMQ [Apache] (英語) など)の STOMP のドキュメントを参照し、ブローカーをインストールして、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 構成を示しています。

<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 (Javadoc) です。そのためには、ブローカーへの TCP 接続を確立し、すべてのメッセージをブローカーに転送し、ブローカーから受信したすべてのメッセージを WebSocket セッションを介してクライアントに転送します。基本的に、メッセージを両方向に転送する「リレー」として機能します。

TCP 接続管理のために、io.projectreactor.netty:reactor-netty および io.netty:netty-all 依存関係をプロジェクトに追加します。

さらに、アプリケーションコンポーネント(HTTP リクエスト処理メソッド、ビジネスサービスなど)は、メッセージ送信に従って、メッセージをブローカーリレーに送信して、サブスクライブされた WebSocket クライアントにメッセージをブロードキャストすることもできます。

実際、ブローカーリレーにより、堅牢でスケーラブルなメッセージブロードキャストが可能になります。