Introdução aos WebSockets com Spring

Introdução aos WebSockets com Spring

1. Visão geral

Neste artigo, criaremos um aplicativo da web simples que implementa mensagens usando onew WebSocket capabilities introduzido com Spring Framework 4.0.

WebSockets é umbi-directional,full-duplex,persistent connection entre um navegador da web e um servidor. Depois que uma conexão WebSocket é estabelecida, a conexão permanece aberta até o cliente ou servidor decidir fechar essa conexão.

Um caso de uso típico pode ser quando um aplicativo envolve vários usuários se comunicando, como em um bate-papo. [#result_box]#We will build a simple chat client in our example. #

2. Dependências do Maven

Como este é um projeto baseado em Maven, primeiro adicionamos as dependências necessárias aopom.xml:


    org.springframework
    spring-websocket
    4.2.4.RELEASE



    org.springframework
    spring-messaging
    4.2.4.RELEASE

Além disso, como usaremosJSON para construir o corpo de nossas mensagens, precisamos adicionar as dependênciasJackson. Isso permite que o Spring converta nosso objeto Java para / deJSON:


    com.fasterxml.jackson.core
    jackson-core
    2.7.3



    com.fasterxml.jackson.core
    jackson-databind
    2.7.3

Se você deseja obter a versão mais recente das bibliotecas acima, procure por elas emMaven Central.

3. Ativar WebSocket na primavera

A primeira coisa a fazer é ativar os recursos do WebSocket. Para fazer isso, precisamos adicionar uma configuração ao nosso aplicativo e anotar essa classe com@EnableWebSocketMessageBroker.

Como o próprio nome sugere, ele permite o tratamento de mensagens do WebSocket, suportado por um intermediário de mensagens:

@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 o métodoconfigureMessageBroker é usado paraconfigure the message broker. Primeiro, habilitamos um agente de mensagens na memória para transportar as mensagens de volta para o cliente em destinos prefixados com “/ tópico”.

Configuração de We complete our simple designando o prefixo “/ app” para filtrar destinos que visam métodos anotados do aplicativo (via@MessageMapping)

O métodoregisterStompEndpoints registra o endpoint “/ chat”, habilitandoSpring’s STOMP support. Lembre-se de que também estamos adicionando aqui um terminal que funciona sem o SockJS por uma questão de elasticidade.

Este endpoint, quando prefixado com “/ app”, é o endpoint para o qual o métodoChatController.send() está mapeado.

Tambémenables the SockJS fallback options, para que as opções de mensagens alternativas possam ser usadas se os WebSockets não estiverem disponíveis. Isso é útil, pois o WebSocket ainda não é suportado em todos os navegadores e pode ser impedido por proxies de rede restritivos.

Os fallbacks permitem que os aplicativos usem uma API WebSocket, mas degradam normalmente para alternativas não WebSocket quando necessário em tempo de execução.

4. Crie o modelo de mensagem

Agora que configuramos o projeto e configuramos os recursos do WebSocket, precisamos criar uma mensagem para enviar.

O nó de extremidade aceitará mensagens contendo o nome do remetente e um texto em uma mensagem STOMP cujo corpo é um objetoJSON.

A mensagem pode ficar assim:

{
    "from": "John",
    "text": "Hello!"
}

Para modelar a mensagem que contém o texto, podemos criar propriedades simples_ Java object with _frometext:

public class Message {

    private String from;
    private String text;

    // getters and setters
}

Por padrão, o Spring usará a bibliotecaJackson para converter nosso objeto de modelo de e para JSON.

5. Crie um controlador de tratamento de mensagens

Como vimos, a abordagem do Spring para trabalhar com mensagens STOMP é associar um método de controlador ao endpoint configurado. Isso é possível por meio da anotação@MessageMapping.

A associação entre o terminal e o controlador nos permite lidar com a mensagem, se necessário:

@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. Preenchemos nosso objeto com o remetente e o texto da mensagem extraído da mensagem recebida e o enriquecemos com um carimbo de data / hora.

Após tratar nossa mensagem, a enviamos para o destino apropriado definido com a anotação@SendTo. Todos os assinantes do destino “/topic/messages” receberão a mensagem.

6. Crie um cliente de navegador

Depois de fazer nossas configurações no lado do servidor, usaremos osockjs-client library para construir uma página HTML simples que interage com nosso sistema de mensagens.

Em primeiro lugar, precisamos importar as bibliotecas cliente Javascriptsockjsestomp. A seguir, podemos criar uma funçãoconnect() para abrir a comunicação com nosso endpoint, uma funçãosendMessage() para enviar nossa mensagem STOMP e uma funçãodisconnect() para fechar a comunicação:


    
        Chat WebSocket
        
        
        
    
    
        


7. Testando o Exemplo

Para testar nosso exemplo, podemos abrir algumas janelas do navegador e acessar a página de bate-papo em:

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

Depois de fazer isso, podemos entrar no chat inserindo um apelido e clicando no botão de conexão. Se escrevermos e enviarmos uma mensagem, podemos vê-la em todas as sessões do navegador que aderiram ao chat.

[#result_box .short_text] # Dê uma olhada na captura de tela para ver um exemplo: #

screenshot

8. Conclusão

Neste tutorial, suporte WebSocket dowe’ve explored Spring. Vimos sua configuração do lado do servidor e construímos umcounterpart do lado do cliente simples com o uso das bibliotecas Javascriptsockjsestomp.

O código de exemplo pode ser encontrado emGitHub project.