Ich versuche, eine Nachricht mit Stomp vom Server zu einem Client zu senden. Ich weiß, dass mit sock.js und Stomp auf Client-Seite kann ich eine Nachricht von einem Benutzer an einen anderen senden, ohne viel Server-Side-Interaktion, einfach durch Verwendung einer @ SendTo Annotation in einer Controller-Methode. Die Nachricht, die der Benutzer erhalten soll, wird jedoch auf dem Server generiert (eigentlich sende ich ein ganzes Objekt, aber der Einfachheit halber sage ich nur, dass ich versuche, einen String zu senden). Dies betrifft insbesondere die Annahme von Freundschaftsanfragen, und wenn ein Benutzer eine Freundschaftsanfrage annimmt, sollte derjenige, der die Anfrage gesendet hat, eine Nachricht erhalten, dass seine Anfrage akzeptiert wurde. Nach einem einfachen Ajax-Aufruf an eine Ruhe-Controller-Methode zur Annahme einer Anfrage sollte das Verfahren die Nachricht auch an den anderen Benutzer senden. Hier ist der Code:Spring Stomp - sende eine Nachricht vom Server mit SimpMessagingTemplate
@RestController
@RequestMapping("/rest/user")
public class UserController{
@Autowired
SimpMessagingTemplate simp;
@RequestMapping(value="/acceptFriendRequest/{id}", method=RequestMethod.GET, produces = "application/json")
public boolean acceptFriendRequest(@PathVariable("id") int id){
UserDTO user = getUser(); // gets logged in user
if (user == null)
return false;
... // Accept friend request, write in database, etc.
String username = ... // gets the username from a service, works fine
simp.convertAndSendToUser(username, "/project_sjs/notify/acceptNotification", "Some processed text!");
return true;
}
}
Und hier ist die Web-Socket-Konfiguration:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/sendNotification").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/notify");
config.setApplicationDestinationPrefixes("/project_sjs");
}
}
Und dies ist die JavaScript-Funktion:
function setupWebsockets(){
var socketClient = new SockJS("/project_sjs/sendNotification");
stompClient = Stomp.over(socketClient);
stompClient.connect({}, function(frame){
stompClient.subscribe("/project_sjs/notify/acceptNotification", function(retVal){
console.log(retVal);
});
});
}
Wenn ein Benutzer der Freundschaftsanfrag akzeptiert, ist alles geschrieben gut in der Datenbank. Ich kann sogar sehen, dass der andere Benutzer jetzt mein Freund ist, wenn ich die Seite aktualisiere. Der andere Benutzer erhält jedoch nie die Nachricht, dass seine Anfrage akzeptiert wurde. Gibt es irgendetwas, was ich falsch mache? Jede Hilfe würde sehr geschätzt werden. Vielen Dank!
Hast du die Antwort bekommen? –
Ich löste dieses Problem mit einem anderen Ansatz. Anstatt alle Benutzer auf dem gleichen Endpunkt "/ project_sjs/notify/acceptNotification" zu abonnieren und sie dann nach Benutzernamen zu unterscheiden, habe ich letztendlich jeden Benutzer auf einen anderen Endpunkt abonniert, zum Beispiel "/ project_sjs/notify/acceptNotification/John123". Auf diese Weise erhalten alle Benutzer mit dem Benutzernamen John123 (der nur eine Person ist, weil Benutzernamen eindeutig sind) die Benachrichtigung. Und es hat gut genug geklappt. –