spring-boot - 使用 Spring Websocket 向特定用户发送消息

标签 spring-boot spring-security spring-websocket stomp

我使用本教程中描述的 spring 设置了一个 WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/ .我需要的是我的服务器每 5 秒向特定用户发送一条消息。所以我首先做了这个:

@Autowired
private SimpMessagingTemplate template;

@Scheduled(fixedRate = 5000)
public void greet() {
    template.convertAndSend("/topic/greetings", new Greeting("Bufff!"));
}

而且它有效。现在,为了仅向特定用户发送消息,我更改了以下内容:

@Scheduled(fixedRate = 5000)
public void greet() {
   template.convertAndSendToUser("MyName","/queue/greetings", new Greeting("Bufff!"));
}

在 WebSocketConfig.java 中添加队列:

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

更改 GreetingController.java 中的注解:

@MessageMapping("/hello")
@SendToUser("/queue/greetings")
public Greeting UserGreeting(HelloMessage message, Principal principal) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}

并更改 app.js 中的连接函数:

var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('user/queue/greetings', function (greeting) {
        showGreeting(JSON.parse(greeting.body).content);
    });
});

服务器使用 spring-boot-security,我通过使用 SimpUserRegistry https://stackoverflow.com/a/32215398/11663023 查找所有用户来确定 MyName 是否是正确的名称).但不幸的是我的代码不起作用。我已经试过了Sending message to specific user using spring但我不希望 Spring 区分 session 和用户。我也看了这个Sending message to specific user on Spring Websocket但它没有帮助,因为链接不起作用。

这是我的控制台日志:

2020-01-20 17:08:51.352 DEBUG 8736 --- [nboundChannel-3] .WebSocketAnnotationMethodMessageHandler : Searching methods to handle SEND /app/hello session=kvv0m1qm, lookupDestination='/hello'
2020-01-20 17:08:51.352 DEBUG 8736 --- [nboundChannel-3] .WebSocketAnnotationMethodMessageHandler : Invoking de.iteratec.iteraweb.controllers.GreetingController#UserGreeting[2 args]
2020-01-20 17:08:52.354 DEBUG 8736 --- [nboundChannel-3] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Hello, hey!"}
2020-01-20 17:08:54.882 DEBUG 8736 --- [MessageBroker-2] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Bufff!"}
2020-01-20 17:08:59.883 DEBUG 8736 --- [MessageBroker-4] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Bufff!"}

我是否错过了更改?

最佳答案

您能看到客户端成功订阅了您的端点吗?

我认为您缺少客户端代码中的第一个 / 'user/queue/greetings' 应该是 '/user/queue/greetings'

关于spring-boot - 使用 Spring Websocket 向特定用户发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827107/

相关文章:

spring - 如何使用带有 SSL 的 Spring WebSocketClient?

Spring Boot 无法运行 maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.ForkedBooter

java - 如何将json数组映射到java类

java - 如何在重定向中添加授权 header (Spring Security)

spring - 无法将 Spring Security @Secured Annotation 导入 Grails 3

java - Spring安全认证: always redirect to error login page

java - 在 Java 中连接到 websocket

websocket - 为什么 sockJS 将 '/info' 添加到给定的 websocket url 路径

java - Spring Boot从1.5迁移到2.1, hibernate 错误

java - 我想将我的 java 14 应用程序部署到 Heroku,但我遇到了 java 版本的一些问题