SpringでのWebSocketの紹介
1. 概要
この記事では、Spring Framework 4.0で導入されたnew WebSocket capabilitiesを使用してメッセージングを実装する簡単なWebアプリケーションを作成します。
WebSocketsは、Webブラウザーとサーバーの間のbi-directional、full-duplex、persistent connectionです。 WebSocket接続が確立されると、クライアントまたはサーバーがこの接続を閉じることを決定するまで、接続は開いたままになります。
典型的な使用例は、チャットのように、アプリに複数のユーザーが互いに通信する場合です。 [#result_box]#We will build a simple chat client in our example. #
2. Mavenの依存関係
これはMavenベースのプロジェクトであるため、最初に必要な依存関係をpom.xmlに追加します。
org.springframework
spring-websocket
4.2.4.RELEASE
org.springframework
spring-messaging
4.2.4.RELEASE
さらに、JSONを使用してメッセージの本文を作成するため、Jacksonの依存関係を追加する必要があります。 これにより、SpringはJavaオブジェクトをJSONとの間で変換できます。
com.fasterxml.jackson.core
jackson-core
2.7.3
com.fasterxml.jackson.core
jackson-databind
2.7.3
上記のライブラリの最新バージョンを入手したい場合は、Maven Centralでそれらを探してください。
3. SpringでWebSocketを有効にする
最初に行うことは、WebSocket機能を有効にすることです。 これを行うには、アプリケーションに構成を追加し、このクラスに@EnableWebSocketMessageBrokerアノテーションを付ける必要があります。
その名前が示すように、メッセージブローカーによって支えられたWebSocketメッセージ処理を有効にします。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat");
registry.addEndpoint("/chat").withSockJS();
}
}
Here, we can see thatメソッドconfigureMessageBrokerはconfigure the message brokerに使用されます。 最初に、メモリ内メッセージブローカが、「/ topic」というプレフィックスが付いた宛先でクライアントにメッセージを戻すことができるようにします。
「/ app」プレフィックスを指定して、アプリケーションの注釈付きメソッドを対象とする宛先をフィルタリングすることによるWe complete our simple構成(@MessageMappingを介して)。
registerStompEndpointsメソッドは、「/ chat」エンドポイントを登録し、Spring’s STOMP supportを有効にします。 ここでは、弾力性のためにSockJSなしで動作するエンドポイントも追加していることに注意してください。
このエンドポイントは、プレフィックスが「/ app」の場合、ChatController.send()メソッドが処理するようにマップされるエンドポイントです。
また、enables the SockJS fallback options,を使用して、WebSocketが使用できない場合に代替のメッセージングオプションを使用できるようにします。 WebSocketはまだすべてのブラウザでサポートされておらず、制限的なネットワークプロキシによって除外される可能性があるため、これは便利です。
フォールバックにより、アプリケーションはWebSocket APIを使用できるようになりますが、実行時に必要に応じてWebSocket以外の代替物にスムーズに移行できます。
4. メッセージモデルを作成する
プロジェクトを設定し、WebSocket機能を構成したので、送信するメッセージを作成する必要があります。
エンドポイントは、送信者名と本文がJSONオブジェクトであるSTOMPメッセージ内のテキストを含むメッセージを受け入れます。
メッセージは次のようになります。
{
"from": "John",
"text": "Hello!"
}
テキストを含むメッセージをモデル化するために、単純な_ Java object with _fromおよびtextプロパティを作成できます。
public class Message {
private String from;
private String text;
// getters and setters
}
デフォルトでは、SpringはJacksonライブラリを使用して、モデルオブジェクトをJSONとの間で変換します。
5. メッセージ処理コントローラーを作成する
これまで見てきたように、STOMPメッセージングを操作するSpringのアプローチは、コントローラーメソッドを構成済みのエンドポイントに関連付けることです。 これは、@MessageMappingアノテーションによって可能になります。
エンドポイントとコントローラーの関連付けにより、必要に応じてメッセージを処理することができます。
@MessageMapping("/chat")
@SendTo("/topic/messages")
public OutputMessage send(Message message) throws Exception {
String time = new SimpleDateFormat("HH:mm").format(new Date());
return new OutputMessage(message.getFrom(), message.getText(), time);
}
For the purposes of our example, we’ll create another model object named OutputMessage to represent the output message sent to the configured destination。 オブジェクトに送信者と受信メッセージから取得したメッセージテキストを入力し、タイムスタンプを追加します。
メッセージを処理した後、@SendToアノテーションで定義された適切な宛先にメッセージを送信します。 「/topic/messages」宛先へのすべてのサブスクライバーがメッセージを受信します。
6. ブラウザクライアントを作成する
サーバー側で構成を行った後、sockjs-client libraryを使用して、メッセージングシステムと対話する単純なHTMLページを作成します。
まず、sockjsとstompのJavascriptクライアントライブラリをインポートする必要があります。 次に、エンドポイントとの通信を開くためのconnect()関数、STOMPメッセージを送信するためのsendMessage()関数、および通信を閉じるためのdisconnect()関数を作成できます。
Chat WebSocket
7. 例のテスト
8. 結論
このチュートリアルでは、we’ve exploredSpringのWebSocketサポート。 サーバー側の構成を確認し、sockjsとstompのJavascriptライブラリを使用して単純なクライアント側のcounterpartを構築しました。
サンプルコードはGitHub projectにあります。