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 verwendensimpMessagingTemplate.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?