web-dev-qa-db-fra.com

WebSocket avec Sockjs & Spring 4 mais sans Stomp

Existe-t-il un moyen d'utiliser WebSockets avec le client SockJS et le serveur Spring 4 mais sans utiliser STOMP?

Sur la base de ce tutoriel du site Web de Spring, je sais comment configurer une application WebSocket à l'aide de Stomp et Spring 4. Du côté client, nous avons:

     var socket = new SockJS('/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function(greeting){
                showGreeting(JSON.parse(greeting.body).content);
            });
        });

Et côté serveur, nous avons les éléments suivants dans le contrôleur:

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(3000); // simulated delay
    return new Greeting("Hello, " + message.getName() + "!");
}

Maintenant, je comprends que @MessageMapping("/hello") garantit que si un message est envoyé à une destination "/hello", Alors la méthode greeting() sera appelée. Et puisque le stompClient est abonné à "/topic/greetings", La @SendTo("/topic/greetings") renverra le message au stompClient.

Mais le problème avec ce qui précède est que stompClient est un objet Stomp. Et je veux simplement utiliser sock.send('test'); et le faire livrer à la destination de mon serveur. Et je veux faire @SendTo("myownclientdestinationmap"), je peux le recevoir par

sock.onmessage = function(e) {
     console.log('message', e.data);
 };

Donc, est-il possible de le faire avec Spring 4, SockJS et sans Stomp? Ou Spring 4 WebSocket prend-il uniquement en charge Stomp?

32
BlueChips23

Spring prend en charge STOMP sur WebSocket mais l'utilisation d'un sous-protocole est non obligatoire, vous pouvez gérer le websocket brut. Lorsque vous utilisez un websocket brut, le message envoyé manque d'informations pour que Spring le route vers une méthode de gestion de message spécifique (nous n'avons pas de protocole de messagerie), donc au lieu d'annoter votre contrôleur, vous devrez implémenter un WebSocketHandler:

public class GreetingHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        Thread.sleep(3000); // simulated delay
        TextMessage msg = new TextMessage("Hello, " + message.getPayload() + "!");
        session.sendMessage(msg);
    }
}

Ajoutez ensuite votre gestionnaire au registre dans la configuration (vous pouvez ajouter plusieurs gestionnaires et utiliser SockJS pour les options de secours):

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(greetingHandler(), "/greeting").withSockJS();
    }

    @Bean
    public WebSocketHandler greetingHandler() {
        return new GreetingHandler();
    }
}

Le côté client ressemblera à ceci:

var sock = new SockJS('http://localhost:8080/greeting');

sock.onmessage = function(e) {
    console.log('message', e.data);
}
52
Sergi Almar