Spring Stomp @SubscribeMapping ( "/user/..." ) с пользовательским назначением не работает

Мне нужно отреагировать на абонентскую подписку.

Пример:

Пользователь подписывается на /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.


Я не могу себе представить, что это невозможно. Что я пропустил/сделал неправильно?

Спасибо :)

Ответ 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();
}