2015-01-21 17 views
5

Spring websocket uygulamasında çalışıyorum. müşterilerine bir mesaj göndererek, iki yolu vardır:SimpMessagingTemplate içinde convertAndSendToUser yönteminde yayınlamayı reddetmeTemplate

1) SimpMessagingTemplate

@SendToUser ait convertAndSendToUser yöntemi kullanarak @SendToUser ek açıklama
2) kullanma false ayarlarsanız broadcast denilen bir boolean parametre alır mesajı yayımlayan mevcut oturum. Bu davranışı SimpMessagingTemplate'da alabileceğim bir yol var mı? Eğer convertAndSendToUser aşırı sadece kullanımınız kullanım örneği için gerekenler, Yani

if (broadcast) { 
    this.messagingTemplate.convertAndSendToUser(user, destination, returnValue); 
} 
else { 
    this.messagingTemplate.convertAndSendToUser(user, destination, returnValue, createHeaders(sessionId)); 
} 

ve SessionID `ile Map sağlamak: Biz SendToMethodReturnValueHandler kaynak koduna bir göz atacak olursak

cevap

4

, göreceğiz:

messagingTemplate.convertAndSendToUser(user, destination, payload, 
      Collections.singletonMap(SimpMessageHeaderAccessor.SESSION_ID_HEADER, sessionId)) 
+0

() ', bazı iş, teşekkür ederim diğer kullanıcıları bilgilendirmek istiyoruz yapılır sonra bu yöntemde. –

+0

Lütfen, yeni bir SO sorusunu –

+0

arayınız. [Belirli bir kullanıcıAdı (userId) üzerinde Sping Websocket entegrasyonu kullanarak nasıl abone olunur? + @RequestMapping ile belirtilen yöntemden bildirim alsın?] (Https://stackoverflow.com/q/ 47628608/3425489) –

1

Yukarıdaki yanıt benim için çalışmadı. İlkbahar 4.1.4 ile biraz farklı bir şey gerektiği ortaya çıkıyor. Bana en temiz görünüyor

yolu aşağıdaki gibidir:

SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(); 
headerAccessor.setSessionId(cmd.getSessionId()); 
headerAccessor.setLeaveMutable(true); 
MessageHeaders messageHeaders = headerAccessor.getMessageHeaders(); 

messagingTemplate.convertAndSendToUser(cmd.getPrincipal().getName(), 
     "/queue/responses", ret, messageHeaders); 

açıkça SimpMessagingTemplate.convertAndSendToUser gönderilen Haritası() için bir "nativeHeaders" değer katmak için oldu çalıştı başka bir yol. Ancak, bu şekilde uygulama ayrıntılarını çok fazla bağlı görünüyor:

Map<String, Object> headers = new HashMap<>(); 
headers.put("nativeHeaders", new HashMap<String, Object>()); 
headers.put(SimpMessageHeaderAccessor.SESSION_ID_HEADER, cmd.getSessionId()); 

messagingTemplate.convertAndSendToUser(cmd.getPrincipal().getName(), 
     "/queue/responses", ret, headers); 

değil iş SimpMessagingTemplate.processHeaders() ve MessageHeaderAccessor oldu bir harita "simpSessionId" başlığını ve başka bir şey ayarlama yapılmış "kusurlu kodu" .getAccessor (MessageHeaders, Class requiredType).

+0

Kodunuzda 'cmd' nedir? – mkczyk

1

İlkbaharın açık bir belgesi yok, farklı bir şekilde denedim, yalnızca kodun altında çalışıyorum. Benim yöntem @ RequestMapping `ile açıklamalı eğer ben` sessionId` alabilirim nasıl

SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.create(); 
accessor.setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, sessionId); 
messagingTemplate.convertAndSendToUser(sessionId, destination, payload, accessor.getMessageHeaders()); 
İlgili konular