Внутренняя подписка на сообщения spring-websocket

Я использую spring-websocket для отправки сообщений клиентам браузера.

Мои настройки почти идентичны настройкам в примере портфолио, и я отправляю сообщения, используя Операции по отправке сообщений:

MessageSendingOperations<String> messagingTemplate = //...;
this.messagingTemplate.convertAndSend("/topic/data/1", message);

Это работает отлично.

Но я также хотел бы иметь возможность подписываться на те же сообщения внутри.

Операции по приему сообщений выглядит почти так же, как тот, который нужно использовать, но, похоже, он поддерживает только получение сообщений. Я бы предпочел, чтобы сообщения отправлялись на мою службу.

SubscribeableChannel.subscribe() тоже выглядит многообещающе, но как мне получить правильный канал?

Я действительно хотел бы иметь возможность вызывать что-то вроде

messagingTemplate.subscribe("/topic/data/*", 
                            new MessageHandler<String>{
                                public void handleMessage(String s){
                                  // process message
                                }
                            });

person Rasmus Faber    schedule 16.07.2014    source источник


Ответы (1)


Для меня работает следующее, но было бы неплохо с более прямым способом сделать это:

public interface MessageHandler<T> {
    public void handleMessage(T message);
}

@Autowired
private AbstractSubscribableChannel brokerChannel;

private PathMatcher pathMatcher = new AntPathMatcher();

private <T> void subscribe(final String topic, final Handler<T> handler, final Class<T> messageClass){
    brokerChannel.subscribe(new MessageHandler() {
        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message);
            final String destination = headers.getDestination();
            if(pathMatcher.match(topic, destination)) {
                final T messageObject = (T) messageConverter.fromMessage(message, messageClass);
                handler.handleMessage(messageObject);
            }
        }
    });
}
person Rasmus Faber    schedule 17.07.2014
comment
Здравствуйте, мне тоже нужен этот функционал. Можете ли вы показать фактическое использование ваших классов? - person Abzal Kalimbetov; 22.05.2015