【问题标题】:Spring Stomp @SubscribeMapping("/user/...") with User Destination doesn't workSpring Stomp @SubscribeMapping("/user/...") with User Destination 不起作用
【发布时间】:2014-11-13 16:50:48
【问题描述】:

我需要对用户目标订阅做出反应。

示例:

用户订阅/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。


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

谢谢:)

【问题讨论】:

    标签: spring websocket stomp spring-4 spring-websocket


    【解决方案1】:

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

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

    控制器:

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

    【讨论】:

    • 谢谢!这个配置会“破坏”任何东西或改变默认行为吗?我只是想知道为什么这不是默认设置
    • 此配置不会破坏任何内容,以 /user 开头的消息将被传送到用户目标处理程序和您的控制器
    • 不使用Principal也有解决办法吗?
    • Pepster,你可能会问一个单独的问题。您可以使用@Headers 从消息的标题中获取数据.. 但这可能不是您想问的。
    • 很好的答案谢谢,但是我收到以下错误?有什么建议? org.springframework.messaging.simp.annotation.support.MissingSessionUserException:消息中没有“用户”标头
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多