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

我的设置几乎与the portfolio example中的设置相同,我使用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
                                }
                            });

最佳答案

以下内容对我有用,但采用更直接的方法会很好:

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);
            }
        }
    });
}

09-11 20:00
查看更多