spring 有没有办法从常规方法发送 websocket 消息

Is there a way to send websocket message from regular method in spring

我正在构建 Web 应用程序。提供了管理员和用户角色。当用户进行某些操作时,管理员会收到一条消息,表明发生了一些事情。用户登录时建立 Websocket 连接。有没有办法不为用户创建 ws 连接,只使用 HHTP 协议发送消息,只从控制器方法发送 WS 消息?

现在我有这些设置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
    }
}
@Controller
public class NotificationController {
    @MessageMapping("/notification")
    @SendTo("/topic/test")
    public Notification getNotification(Notification notification) {
        return notification;
    }
}

是的,这是可能的。
您必须使用 @Autowire 或构造函数注入 SimpleMessagintTemplate。

private final SimpMessagingTemplate simpMessagingTemplate;
public ConstructorName(SimpMessagingTemplate simpMessagingTemplate){
    this.simpMessagingTemplate = simpMessagingTemplate;
}

在您的控制器中,或您要向客户端发送消息的函数中,使用 convertAndSendToUser 函数。

simpMessagingTemplate.convertAndSendToUser("userId","/private", messageData);

在 javascript 客户端。

var Sock = new SockJS('http://localhost:8080/ws');
stompClient = over(Sock);
stompClient.connect({}, onConnected, onError);

stompClient.subscribe('/topic/' + userId + '/private', onMessageReceived);