Я подключаюсь через SockJS через STOMP к моему бэкэнду Spring. Все работает нормально, конфигурация работает для всех браузеров и т. Д. Однако я не могу найти способ отправить начальное сообщение. Сценарий будет следующим:
- Клиент подключается к теме
function connect() { var socket = new SockJS('http://localhost:8080/myEndpoint'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { setConnected(true); console.log('Connected: ' + frame); stompClient.subscribe('/topic/notify', function(message){ showMessage(JSON.parse(message.body).content); }); }); }
а конфигурация бэкэнда выглядит примерно так:
@Configuration @EnableWebSocketMessageBroker public class WebSocketAppConfig extends AbstractWebSocketMessageBrokerConfigurer { ... @Override public void registerStompEndpoints(final StompEndpointRegistry registry) { registry.addEndpoint("/myEndpoint").withSockJS(); }
- Я хочу отправить клиенту автоматический ответ от бэкэнда (на событие подключения), чтобы я уже мог предоставить ему некоторый набор данных (например, прочитать sth из базы данных) без необходимости для него (клиента) отправлять GET запрос (или любой другой). Подводя итог, я просто хочу отправить ему сообщение по теме с помощью объекта SimMessagingTemplate сразу после того, как он подключился.
Обычно я делаю это так, например в контроллере REST, когда шаблон уже настроен автоматически:
@Autowired private SimpMessagingTemplate template; ... template.convertAndSend(TOPIC, new Message("it works!"));
Как этого добиться при подключении к событию?
ОБНОВЛЕНИЕ
Мне удалось заставить это работать. Однако меня все еще немного смущает конфигурация. Я покажу здесь 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) Второе решение
Часть 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);
РЕЗЮМЕ:
В первом случае используются две подписки - этого я хотел избежать и думал, что с этим можно справиться только с помощью одной.
У второго, однако, нет префикса для приложения. Но, по крайней мере, у меня может быть одна подписка, чтобы слушать предоставленную тему, а также отправлять начальное сообщение.