STOMP を介して SockJS を介して Spring バックエンドに接続しています。すべてが正常に機能し、構成はすべてのブラウザーなどでうまく機能します。ただし、最初のメッセージを送信する方法が見つかりません。シナリオは次のようになります。
- クライアントはトピックに接続します
関数接続() { var socket = new SockJS('http://localhost:8080/myEndpoint'); stompClient = Stomp.over(ソケット); stompClient.connect({}, 関数(フレーム) { setConnected(真); console.log('接続済み:' + フレーム); stompClient.subscribe('/topic/notify', 関数(メッセージ){ showMessage(JSON.parse(message.body).content); }); }); }
バックエンド構成は多かれ少なかれ次のようになります。
@構成 @EnableWebSocketMessageBroker public class WebSocketAppConfig extends AbstractWebSocketMessageBrokerConfigurer { ... @オーバーライド public void registerStompEndpoints(最終 StompEndpointRegistry レジストリ) { registry.addEndpoint("/myEndpoint").withSockJS(); }
- バックエンドから (接続イベントで) 自動応答をクライアントに送信して、クライアント (クライアント) が GET を送信する必要なく、データセット (たとえば、db から sth を読み取る) をクライアントに提供できるようにします。リクエスト(またはその他)。要約すると、彼が接続した直後に、SimMessagingTemplate オブジェクトを使用してトピックに関するメッセージを彼に送信したいだけです。
通常、テンプレートが既に自動配線されている場合は、REST コントローラーなどで次のようにします。
@Autowired プライベート SimpMessagingTemplate テンプレート。 ... template.convertAndSend(TOPIC, new Message("動作します!"));
接続イベントでこれを達成するにはどうすればよいですか?
アップデート
私はそれを機能させることができました。しかし、私はまだ構成について少し混乱しています。ここでは、最初のメッセージを送信する方法を 2 つの構成で示します。
1) 最初の解決策
JS部分
stompClient.subscribe('/app/pending', function(message){
showMessage(JSON.parse(message.body).content);
});
stompClient.subscribe('/topic/incoming', function(message){
showMessage(JSON.parse(message.body).content);
});
Java部分
@Controller
public class WebSocketBusController {
@SubscribeMapping("/pending")
構成
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
...およびその他の呼び出し
template.convertAndSend("/topic/incoming", outgoingMessage);
2) 2 番目の解決策
JS部分
stompClient.subscribe('/topic/incoming', function(message){
showMessage(JSON.parse(message.body).content);
})
Java部分
@Controller
public class WebSocketBusController {
@SubscribeMapping("/topic/incoming")
構成
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
// NO APPLICATION PREFIX HERE
}
...およびその他の呼び出し
template.convertAndSend("/topic/incoming", outgoingMessage);
まとめ:
最初のケースでは、2 つのサブスクリプションを使用します。これは避けたかったので、1 つだけで管理できると考えました。
ただし、2 番目のものにはアプリケーションの接頭辞がありません。しかし、少なくとも、提供されたトピックをリッスンし、最初のメッセージを送信するための単一のサブスクリプションを持つことができます。