У меня есть весенний загрузочный сервер и клиент, которые подключены через Websockets с помощью STOMP.
Мой пример использования: я хочу отправлять данные клиенту каждый раз, когда делается http-запрос к определенной конечной точке.Все учебники, которые я нашел, показывают только тот случай, когда клиент отправляет некоторые данные в «/ hello», а сервер реагирует, отправляя данные в «topic / greetings»:
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}
Что мне нужно, так этоМетод контроллера, который отправляет данные без необходимости отображения сообщений.Он должен просто отправлять данные клиенту каждый раз, когда кто-то выполняет запрос на получение к конечной точке.Я попробовал следующее, но это не сработало:
@Autowired
private SimpMessagingTemplate msgTemplate;
@SendTo("topic/data-received")
@RequestMapping(value = "/send-data", method = RequestMethod.POST)
public String sendData(@RequestHeader(value = "id") String id,
@RequestHeader(value = "data") String data) {
User user = new User();
user.id = UUID.fromString(id);
user.stringData = data;
database.saveStringData(user);
msgTemplate.convertAndSend("topic/data-received", "data sent!!");
return "successful";
}
Вот мой код клиента:
function connect() {
var socket = new SockJS('/clipboard-websocket');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('topic/data-received/', function (message) {
alert("Data received!!");
});
}
И это моя конфигурация WebSocket:
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/clipboard-websocket").withSockJS();
}