SpringによるWebSocketsの紹介

SpringでのWebSocketの紹介

1. 概要

この記事では、Spring Framework 4.0で導入されたnew WebSocket capabilitiesを使用してメッセージングを実装する簡単なWebアプリケーションを作成します。

WebSocketsは、Webブラウザーとサーバーの間のbi-directionalfull-duplexpersistent 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メソッドconfigureMessageBrokerconfigure 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ページを作成します。

まず、sockjsstompのJavascriptクライアントライブラリをインポートする必要があります。 次に、エンドポイントとの通信を開くためのconnect()関数、STOMPメッセージを送信するためのsendMessage()関数、および通信を閉じるためのdisconnect()関数を作成できます。


    
        Chat WebSocket
        
        
        
    
    
        


7. 例のテスト

この例をテストするために、いくつかのブラウザウィンドウを開いて、次のチャットページにアクセスできます。

http://localhost:8080/spring-mvc-java/resources/chat.html

これが完了したら、ニックネームを入力して接続ボタンを押すことでチャットに参加できます。 メッセージを作成して送信すると、チャットに参加しているすべてのブラウザセッションでメッセージを確認できます。

[#result_box .short_text]#スクリーンショットを見て例を見てください:#

screenshot

8. 結論

このチュートリアルでは、we’ve exploredSpringのWebSocketサポート。 サーバー側の構成を確認し、sockjsstompのJavascriptライブラリを使用して単純なクライアント側のcounterpartを構築しました。

サンプルコードはGitHub projectにあります。