Spring websocket отправляет сообщение из очереди пользователю convertAndSendToUser не работает

У меня есть сценарий, в котором я хочу, чтобы пользователи подписывались на фиксированную конечную точку веб-сокета и не упоминали имя очереди или тему при подписке. Я хочу обрабатывать логику внутри контроллера для получения их сообщений из соответствующих очередей и отправки обратно каждому пользователю. Что-то вроде этого я хочу добиться: -

Мой клиентский код сначала подключается к конечной точке / веб-сокету: -

client.connectToServer( aWebsocketHandler, URI.create( "wss://host.com/websocket" ) );

Затем отправка кадра подключения и подписки STOMP через веб-сокет

STOMP connect frame :-
accept-version : 1.1
heart-beat : 100000,0

STOMP subscribe frame  :-

destination : /app/fixed 
id : 123
ack : auto
receipt  : 123456

Контроллер кода на стороне сервера, который работает: -

@SubscribeMapping ( "fixed" )
    public void handle( Principal principal ) {
        System.out.println( "principal.getName();" + principal.getName() );
        String queueName = Helper.getClientToQueueMap().get( principal.getName() );
        // in loop just for testing
        while(true){

            Object o = rabbitTemplate.receiveAndConvert(queueName);
            if ( o != null ) {
                System.out.println( "Returning mesg**" + o.toString() );
                simpMessagingTemplate.convertAndSend( "/app/fixed", o.toString() );
            }
            try {
                Thread.sleep(3000);
            } catch ( InterruptedException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            }
       }
       }

Моя веб-конфигурация имеет следующее: -

@Override
    protected void configureStompEndpoints( StompEndpointRegistry registry ) {
        registry.addEndpoint( "/websocket" ).setAllowedOrigins( "*" );

    }

    @Override
    public void configureMessageBroker( MessageBrokerRegistry config ) {
        config.enableStompBrokerRelay( "/topic/", "/queue/", "/exchange/" )
        config.setApplicationDestinationPrefixes("/app");
        config.enableSimpleBroker("/app");
    }

Теперь я хочу изменить этот код, чтобы отправлять сообщения из очереди соответствующему конкретному пользователю. И хотя каждый пользователь будет подписываться на одну и ту же конечную точку / приложение / исправлено, между ними не должно быть обмена сообщениями. Просматривая несколько сообщений, я обнаружил, что клиент может подписаться на / user / queue / fixed, а в контроллере я использую convertAndSendToUser для отправки конкретному пользователю

simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );

Но это не работает. Поскольку я подписываюсь на / user / queue / fixed, этот метод дескриптора контроллера с @SubscribeMapping ("fixed") никогда не вызывается. Может ли кто-нибудь помочь мне в том, что я делаю не так?


person vibhuti pithwa    schedule 25.04.2016    source источник


Ответы (1)


Это сработало для меня со следующими

@SubscribeMapping ("/ user / queue / fixed") на контроллере

и делаю

simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );

клиент подписывается на / user / queue / fixed

person vibhuti pithwa    schedule 26.04.2016