2016-05-28 7 views
0

Ich versuche, in zwei Sitzungen mit demselben Spring Security-Benutzer eine Verbindung herzustellen und die gleiche Warteschlange mit Spring 4.2.4 zu abonnieren. Ich möchte für jede Sitzung separate Nachrichten erhalten. Es ist leicht, mit @SendToUser zu tun, aber es scheint, dass es nicht so trivial ist, wenn Sie SimpMessagingTemplate.sendToUser(...) verwenden - jede Sitzung empfängt alle Nachrichten, die für andere Sitzung spezifisch sind.Broadcast in SimpMessageTemplate.sentToUser (...) im Frühjahr deaktivieren 4.2.4

Beispiel für @SendToUser:

@Controller 
public class TestController { 

    @MessageMapping("/queue/hello") 
    @SendToUser(value = "/queue/hello", broadcast = false) 
    public String test() { 
     return Integer.toString(new Random().nextInt()); 
    } 

} 

Beispiel für SimpMessagingTemplate:

template.convertAndSendToUser("SessionUser{id=123}", "/queue/hello", "test"); 

ich wie vorgeschlagen habe versucht, in diesem Thread zum Beispiel sessionId in Header hinzufügen: sending-error-message-in-spring-websockets Leider hilft es nicht, in dieser Version von Frühling. Hat jemand irgendwelche Ideen?

Antwort

0

Scheint, dass Sitzung Sitzungs-ID in Headern noch funktioniert, aber es muss SimpSessionId, nicht SessionId sein. Meine Annahmen, wo das Problem liegt, waren alle falsch. Zusammenfassend können wir diese überladene Methode verwenden:

simpMessagingTemplate.convertAndSendToUser("SessionUser{id=123}", "/queue/hello", "test", headers); 

wo die Header erstellt werden durch:

private MessageHeaders createHeaders(String sessionId) { 
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); 
    headerAccessor.setSessionId(sessionId); 
    headerAccessor.setLeaveMutable(true); 
    return headerAccessor.getMessageHeaders(); 
} 

und für den Zugriff auf simpSessionId sollten wir verwenden:

SimpMessageHeaderAccessor.getSessionId(message.getHeaders()) 

Hoffnung dies ist nützlich für jemand.