У меня есть следующий код на стороне клиента:
var sock = new SockJS('http://localhost:8443/quote-socket');
const stompClient = Stomp.over(sock);//connect using your client
stompClient.connect({}, onConnected, onError);
function onConnected() {
stompClient.subscribe('/topic/prices', payload => {
console.log('DATA COMING!');
console.log(payload);
});
stompClient.send("ws/quote/FB",
{},
JSON.stringify({})
);
}
function onError(error) {
console.log('there is an error');
console.log(error);
}
И это сторона загрузки Spring (т.е. сервера):
@Override
@MessageMapping("/quote/{symbol}")
@SendTo("/topic/prices")
public String getSingleQuote(@DestinationVariable("symbol") String symbol, HttpServletResponse response) {
return "Hello";
}
И это конфигурация веб-сокета:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/ws");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/quote-socket").setAllowedOrigins("http://localhost:8080").withSockJS();
}
}
Я вижу следующие журналы в консоли браузера:
Opening Web Socket...
Web Socket Opened...
>>> CONNECT
accept-version:1.0,1.1,1.2
heart-beat:10000,10000
Received data
<<< CONNECTED
heart-beat:0,0
version:1.2
content-length:0
connected to server undefined
>>> SUBSCRIBE
id:sub-0
destination:/topic/prices
>>> SEND
destination:ws/quote/FB
content-length:2
Но метод контроллера не вызывается, и я не вижу полезной нагрузки насторона браузера.В чем здесь проблема?
Обновление 1 Я обнаружил, что он должен использовать SockJs
следующим образом:
var sock = new SockJS('api/quote-socket');
Но во время разработки я запускаю пользовательский интерфейсdev-сервер (webpack-dev-server) под другим портом, что означает, что мне нужно использовать протокол ws
, а поскольку SockJS его не поддерживает, я должен использовать StopJS.client
:
var url = "ws://localhost:8443/api/quote-socket";
var stompClient = Stomp.client(url);
Есть ли способ использовать ws
на SockJs?Как мы должны использовать разные порты UI-сервера во время разработки, что кажется довольно распространенным явлением.