У меня есть сценарий, в котором я хочу, чтобы пользователи подписывались на фиксированную конечную точку веб-сокета и не упоминали имя очереди или тему при подписке. Я хочу обрабатывать логику внутри контроллера для получения их сообщений из соответствующих очередей и отправки обратно каждому пользователю. Что-то вроде этого я хочу добиться: -
Мой клиентский код сначала подключается к конечной точке / веб-сокету: -
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") никогда не вызывается. Может ли кто-нибудь помочь мне в том, что я делаю не так?