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