Is there a way to use WebSockets with SockJS client and Spring 4 server but not using STOMP?
Based on this tutorial from Spring's website, I know how to set up a WebSocket based application using Stomp and Spring 4. On the client side, we have:
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);
});
});
And on the server side, we have the following in the controller:
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
Now, I understand that @MessageMapping("/hello")
ensures that if a message is sent to a destination "/hello"
, then the greeting()
method will be called. And since the stompClient
is subscribed to "/topic/greetings"
, the @SendTo("/topic/greetings")
will send the message back to the stompClient
.
But the problem with the above is that stompClient is a Stomp object. And I want to simply use sock.send('test');
and have it delivered to my server's destination. And I want to do @SendTo("myownclientdestinationmap")
, I can receive it by
sock.onmessage = function(e) {
console.log('message', e.data);
};
So, any way to do this with Spring 4, SockJS and without Stomp? Or does Spring 4 WebSocket only supports Stomp?
Spring supports
STOMP
overWebSocket
but the use of a subprotocol is not mandatory, you can deal with the raw websocket. When using a raw websocket, the message sent lacks of information to make Spring route it to a specific message handler method (we don't have any messaging protocol), so instead of annotating your controller, you'll have to implement aWebSocketHandler
:And then add your handler to the registry in the configuration (you can add more than one handler and use
SockJS
for fallback options):The client side will be something like this: