Spring Stomp @SubscribeMapping ("/user/...")与用户目的地不起作用

标签 spring websocket stomp spring-4 spring-websocket

我需要对用户目标订阅使用react。

示例:

用户订阅 /user/messages,因为他想接收所有传入的消息。现在我想查找该用户离线时创建的所有消息,然后将它们发送给该用户。

工作代码:

客户端代码:

stompClient.subscribe('/user/messages', function(msg){
    alert(msg.body);
});

服务器代码:

template.convertAndSendToUser(p.getName(), "/messages", "message content");

我需要什么:

似乎无法在服务器端捕获用户目标订阅,即:

@SubscribeMapping("/user/messages")
public void test(Principal p) { 
    sendMessagesThatWereReceivedWhileUserWasOffline();
}

我尝试了什么:

@SubscribeMapping("/messages")
public void test(Principal p) { ... }

如果客户端订阅了 /app/messages,则此方法有效,但它不会被调用 /user/messages

我的配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/queue", "/topic");
        registry.setUserDestinationPrefix("/user");
    }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        return true;
    }

    // all other methods left empty
}

使用 Spring 4.1。


我无法想象这是不可能的。我错过了什么/做错了什么?

谢谢:)

最佳答案

将用户前缀也定义为应用程序前缀,然后您就可以在 Controller 中映射订阅。配置:

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app", "/user");
    registry.enableSimpleBroker("/queue", "/topic");
    registry.setUserDestinationPrefix("/user");
}

Controller :

@SubscribeMapping("/messages")
public void test(Principal p) { 
    sendMessagesThatWereReceivedWhileUserWasOffline();
}

关于Spring Stomp @SubscribeMapping ("/user/...")与用户目的地不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25928047/

相关文章:

java - 使用 ContextRefreshedEvent 参数为私有(private)方法创建 JUnit

spring - @NodeEntity 对象中的 id 在 SDN (Spring Data Neo4j) 5.0.2.RELEASE 中是否唯一(即不回收)?

java - 平板电脑的客户端服务器框架

iphone - Cocoa、Stomp、ActiveMQ、iPhone、SSL 和 AsyncSocket 需要帮助

java - 来自服务器 [200] 的 HTTP 响应不允许 HTTP 升级到 WebSocket

java - Spring Boot Rest 服务表格太大

java - 如何在Spring中保存List并返回PagedResources

javascript - Tomcat 7 Websocket 握手 : Unexpected response code: 404

ios - 无法使用自定义 CA 打开安全的 websocket

java - 使用 Websocket 连接 stomp 和 ActiveMQ