在内部订阅spring-websocket消息

时间:2014-07-16 20:13:08

标签: spring spring-websocket spring-messaging

我使用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
                                }
                            });

1 个答案:

答案 0 :(得分: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);
            }
        }
    });
}