STOMP を有効にする

STOMP over WebSocket サポートは、spring-messaging および spring-websocket モジュールで利用できます。これらの依存関係を取得したら、次の例に示すように、WebSocket 経由で STOMP エンドポイントを公開できます。

import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/portfolio"); (1)
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		config.setApplicationDestinationPrefixes("/app"); (2)
		config.enableSimpleBroker("/topic", "/queue"); (3)
	}
}
1/portfolio は、WebSocket(または SockJS)クライアントが WebSocket ハンドシェイクのために接続する必要があるエンドポイントの HTTP URL です。
2 宛先ヘッダーが /app で始まる STOMP メッセージは、@Controller クラスの @MessageMapping メソッドにルーティングされます。
3 サブスクリプションとブロードキャストに組み込みのメッセージブローカーを使用し、宛先ヘッダーが /topic または /queue で始まるメッセージをブローカーにルーティングします。

次の例は、前述の例に相当する 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:simple-broker prefix="/topic, /queue"/>
	</websocket:message-broker>

</beans>
組み込みの単純なブローカーの場合、/topic および /queue プレフィックスには特別な意味はありません。それらは、pub-sub メッセージングとポイントツーポイントメッセージング(つまり、多くのサブスクライバーと 1 つのコンシューマー)を区別するための単なる規則です。外部ブローカーを使用する場合は、ブローカーの STOMP ページを確認して、サポートしている STOMP 宛先とプレフィックスの種類を理解しましょう。

ブラウザーから接続するには、STOMP の場合、最もアクティブに保守されている JavaScript ライブラリである stomp-js/stompjs [GitHub] (英語) を使用できます。

次のコード例はこれに基づいています。

const stompClient = new StompJs.Client({
       brokerURL: 'ws://domain.com/portfolio',
       onConnect: () => {
           // ...
       }
   });

あるいは、SockJS 経由で接続する場合は、次の手順 (英語) に従って、サーバー側で registry.addEndpoint("/portfolio").withSockJS() を使用して SockJS フォールバックを有効にし、JavaScript 側で SockJS フォールバックを有効にすることができます。

上記の例の stompClient は、login および passcode ヘッダーを指定する必要がないことに注意してください。たとえそれが行われたとしても、それらはサーバー側では無視されます(むしろ上書きされます)。認証の詳細については、ブローカーへの接続および認証を参照してください。

その他のサンプルコードについては、以下を参照してください。