3

我正在使用 spring-websocket 将消息推送到浏览器客户端。

我的设置几乎与投资组合示例中的设置相同,我使用MessageSendingOperations发送消息:

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

这完美地工作。

但我也希望能够在内部订阅相同的消息。

MessageReceivingOperations几乎看起来像使用的那个,但它似乎只支持拉消息。我更希望将消息推送到我的服务。

SubscribableChannel.subscribe()看起来也很有希望,但是我如何获得正确的频道呢?

我真的很希望能够调用类似的东西

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

1 回答 1

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);
            }
        }
    });
}
于 2014-07-17T13:13:19.857 回答