2016-04-25 587 views
0

我有一個場景,我希望用戶訂閱一個固定的websocket端點,而不必在訂閱時提及queuename或topic。我想處理控制器內部的邏輯,從各自的隊列中獲取消息併發回給每個用戶。 這樣的事情我想實現: -Spring websocket從隊列發送消息給用戶convertAndSendToUser不起作用

我的客戶端代碼首先連接到WebSocket端點/ WebSocket的: -

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

然後發送STOMP連接和訂閱框架上的WebSocket

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

我的web配置有以下: -

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

現在我想修改此代碼從隊列發送消息到其各自的特定用戶。即使每個用戶都會訂閱相同的終端/應用程序/固定,但不應該在它們之間共享消息。 通過幾個職位去我發現,客戶可以訂閱/用戶/隊列/固定,我用convertAndSendToUser發送給特定的用戶

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

控制器但這不起作用。由於我正在訂閱/ user/queue/fixed這個控制器句柄方法,使用@SubscribeMapping(「fixed」)永遠不會被調用。有人能幫助我,我做錯了什麼?

回答

0

它的工作對我來說有以下

@SubscribeMapping( 「/用戶/隊列/固定」)在控制器上

,做

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

客戶端訂閱/用戶/隊列/固定

相關問題