Как отправить сообщение клиенту WebSocket с сервера Spring WebSocket с помощью STOMP? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть два приложения Spring Boot WebSocket, использующие STOMP:

  1. Сервер WebSocket
  2. Клиент WebSocket

Я могу отправить сообщение WebSocket с клиент и ответить на него с сервера. Однако теперь я хотел бы отправить клиенту сообщение WebSocket, инициированное событием на стороне сервера.

Может кто-нибудь сказать мне, как это сделать?

Вот что у меня есть теперь на стороне сервера:

WebSocketConfig. java:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic/");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/alarm");
    }
}

WebSocketController. java:

@Controller
public class WebSocketController {

    @MessageMapping("/alarm")
    @SendTo("/topic/message") 
    public void processMessageFromClient(@Payload String message, Principal principal) throws Exception {

        System.out.println("WEBSOCKET MESSAGE RECEIVED" + message);
    }

    @RequestMapping(value = "/start/{alarmName}", method = RequestMethod.POST)
    public String start(@PathVariable String alarmName) throws Exception {
        System.out.println("Starting " + alarmName);

        /* SEND MESSAGE TO WEBSOCKET CLIENT HERE */

        return "redirect:/";
    }
}

1 Ответ

0 голосов
/ 25 февраля 2020

Я нашел ответ в официальной весенней документации .

Вам просто нужно ввести SimpMessagingTemplate.

Мой контроллер теперь выглядит так:

@Controller
public class WebSocketController {

    private SimpMessagingTemplate template;

    @Autowired
    public WebSocketController(SimpMessagingTemplate template) {
        this.template = template;
    }

    @MessageMapping("/alarm")
    @SendTo("/topic/message") 
    public void processMessageFromClient(@Payload String message, Principal principal) throws Exception {

        System.out.println("WEBSOCKET MESSAGE RECEIVED" + message);
    }

    @RequestMapping(value = "/start/{alarmName}", method = RequestMethod.POST)
    public String start(@PathVariable String alarmName) throws Exception {
        System.out.println("Starting " + alarmName);

        this.template.convertAndSend("/topic/message", alarmName);

        return "redirect:/";
    }
}

...