3

spring-websocket を使用してメッセージをブラウザ クライアントにプッシュしています。

私の設定はポートフォリオの例とほぼ同じで、 MessageSendingOperationsを使用してメッセージを送信します。

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

これは完全に機能します。

しかし、同じメッセージを内部で購読できるようにしたいと考えています。

MessageRecomingOperationsは使用するもののように見えますが、メッセージのプルのみをサポートしているようです。メッセージを自分のサービスにプッシュしてもらいたいです。

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 に答える