WebSocketをSockJSクライアントおよびSpring 4サーバーで使用するが、STOMPを使用しない方法はありますか?
SpringのWebサイトからのこのチュートリアルに基づいて、StompとSpring 4を使用してWebSocketベースのアプリケーションをセットアップする方法を知っています。クライアント側には、次のものがあります。
_ 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);
});
});
_
サーバー側では、コントローラーに次のものがあります。
_@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
_
現在、@MessageMapping("/hello")
は、メッセージが宛先_"/hello"
_に送信されると、greeting()
メソッドが呼び出されることを保証することを理解しています。 stompClient
は_"/topic/greetings"
_にサブスクライブされているため、@SendTo("/topic/greetings")
はメッセージをstompClient
に送り返します。
しかし、上記の問題は、stompClientがStompオブジェクトであることです。そして、単にsock.send('test');
を使用して、それをサーバーの宛先に配信したいだけです。そして、私は@SendTo("myownclientdestinationmap")
をしたい、私はそれを受け取ることができます
_sock.onmessage = function(e) {
console.log('message', e.data);
};
_
では、Spock 4、SockJS、およびStompなしでこれを行う方法はありますか?または、Spring 4 WebSocketはStompのみをサポートしていますか?
SpringはSTOMP
を介してWebSocket
をサポートしますが、サブプロトコルの使用は必須ではありませんであり、未加工のWebSocketを処理できます。生のWebSocketを使用する場合、送信されたメッセージは、Springが特定のメッセージハンドラメソッドにルーティングするための情報が不足しているため(メッセージングプロトコルはありません)、コントローラーに注釈を付ける代わりに、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);
}
}
そして、構成内のレジストリにハンドラーを追加します(複数のハンドラーを追加し、フォールバックオプションにSockJS
を使用できます)。
@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();
}
}
クライアント側は次のようになります。
var sock = new SockJS('http://localhost:8080/greeting');
sock.onmessage = function(e) {
console.log('message', e.data);
}