2016-04-25 10 views
0

Ich habe ein Szenario, in dem ich möchte, dass die Benutzer einen festen WebSocket-Endpunkt abonnieren und während des Abonnierens Warteschlangen oder Themen nicht erwähnen müssen. Ich möchte die Logik in einem Controller behandeln, um ihre Nachrichten von ihren jeweiligen Warteschlangen zu erhalten und an jeden Benutzer zurückzusenden. So etwas will ich erreichen: -Spring WebSocket Nachricht von einer Warteschlange an einen Benutzer senden ConvertAndSendToUser funktioniert nicht

Mein Client-Code zunächst an einen websocket Endpunkt/websocket verbindet, ist: -

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

Dann wird ein STOMP verbinden und abonnieren Rahmen über websocket Senden

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

STOMP subscribe frame :- 

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

Der Code Server-Seite Controller, der arbeitet, ist: -

@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(); 
      } 
      } 
     } 
     } 

Meine Web-Konfiguration hat folgende: -

@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"); 
    } 

Jetzt mag ich diesen Code ändern, Nachrichten aus einer Warteschlange zu ihrem jeweiligen spezifischen Benutzer zu senden. Und obwohl jeder Benutzer den gleichen Endpunkt/app/fixed abonniert, sollten keine Nachrichten zwischen ihnen geteilt werden. durch mehrere Beiträge gehen fand ich, dass Client/user/Warteschlange abonnieren/fixiert und in der Steuerung I convertAndSendToUser

auf bestimmte Benutzer senden verwenden
simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/queue/fixed", o.toString()); 

Aber das funktioniert nicht. Da ich/user/queue/fixiere, wird diese Controller-Handle-Methode mit @SubscribeMapping ("fixed") nie aufgerufen. Kann mir jemand helfen, was ich falsch mache?

Antwort

0

Es funktionierte für mich mit folgenden

@SubscribeMapping ("/ user/queue/fixed") auf dem Controller

und/user/Warteschlange abonnieren

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

Client tun/behoben