My Front end client is not receiving the messages from the server. Upon subscribing to the chat it needs to receive a message from the server but this is not received. I’ve tried the client subscribing to /chat and /user/chat but neither work
javascript client:
const stompClient = new StompJs.Client({
brokerURL: 'ws://localhost:8080/ws'
});
stompClient.onConnect = (frame) => {
//setConnected(true);
console.log('Connected: ' + frame);
//console.log('/user/queue/specific-user-user' + frame.headers['user-name']);
stompClient.subscribe('/user/chat', msg => {
console.log('response: ' + msg);
});
};
stompClient.onWebSocketError = (error) => {
console.error('Error with websocket', error);
};
stompClient.onStompError = (frame) => {
console.error('Broker reported error: ' + frame.headers['message']);
console.error('Additional details: ' + frame.body);
};
stompClient.activate();
Broker configuration:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfiguration implements WebSocketMessageBrokerConfigurer {
@Autowired
private HandshakeHandler handshakeHandler;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("http://localhost:4200").setHandshakeHandler(handshakeHandler);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/chat/");
registry.setUserDestinationPrefix("/user");
}
}
Event Listener
@Component
@Slf4j
public class WebSocketEventListener {
@Autowired
private ChatManager chatManager;
@EventListener
private void handleSessionConnected(SessionConnectEvent event) {
log.info("{}", event);
}
@EventListener
private void handleSessionDisconnect(SessionDisconnectEvent event) {
log.info("{}", event);
}
@EventListener
private void handleSessionSubscribe(SessionSubscribeEvent event) {
final Map<String, Object> nativeHeaders = (Map<String, Object>)
event.getMessage().getHeaders().get("nativeHeaders");
final String sessionId =
event.getMessage().getHeaders().get("simpSessionId").toString();
log.info("sessionId: {}", sessionId);
log.info("subscribed destination: {}", nativeHeaders.get("destination"));
log.info("subscribed user {}", event.getUser().getName());
SimpMessageHeaderAccessor headerAccessor =
SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
log.info("Sending reply to: {}", event.getUser().getName());
Message message = new Message().setTo(event.getUser().getName()).setBody("hi");
simpMessagingTemplate.convertAndSendToUser(
event.getUser().getName(), "/chat", message, headerAccessor.getMessageHeaders());
}
}
Handshake Handler
@Configuration
@Slf4j
public class HandshakeHandler extends DefaultHandshakeHandler{
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,
Map<String, Object> attributes) {
Principal principal = request.getPrincipal();
if (principal == null) {
principal = new AnonymousPrincipal();
String uniqueName = UUID.randomUUID().toString();
((AnonymousPrincipal) principal).setName(uniqueName);
log.info("new user: {}", uniqueName);
}
return principal;
}
}
Here are the logs from org.springframework.messaging=TRACE
...configuration.HandshakeHandler : new user: 8eee251d-2777-430c-b137-a5f462d7dd8f
....s.messaging.simp.stomp.StompDecoder : Decoded CONNECT {accept-version=[1.2,1.1,1.0], heart-beat=[10000,10000]} session=null
....s.m.s.b.SimpleBrokerMessageHandler : Processing CONNECT user=8eee251d-2777-430c-b137-...i.listener.WebSocketEventListener : SessionConnectEvent[GenericMessage [payload=byte[0], headers={simpMessageType=CONNECT, stompCommand=CONNECT, nativeHeaders={accept-version=[1.2,1.1,1.0], heart-beat=[10000,10000]}, simpSessionAttributes={}, simpHeartbeat=[J@7d5c7266, simpUser=AnonymousPrincipal(name=8eee251d-2777-430c-b137-a5f462d7dd8f), simpSessionId=d480e89a-813b-7776-23e0-6a0e34e9c70c}]]
...s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECTED, headers={version=[1.2], heart-beat=[0,0], user-name=[8eee251d-2777-430c-b137-a5f462d7dd8f]}
...s.messaging.simp.stomp.StompDecoder : Decoded SUBSCRIBE {id=[sub-0], destination=[/user/chat]} session=null
..s.m.s.u.UserDestinationMessageHandler : Translated /user/chat -> [/chat-userd480e89a-813b-7776-23e0-6a0e34e9c70c]
...w.i.listener.WebSocketEventListener : sessionId: d480e89a-813b-7776-23e0-6a0e34e9c70c
...w.i.listener.WebSocketEventListener : subscribed destination: [/user/chat]
...w.i.listener.WebSocketEventListener : subscribed user 8eee251d-2777-430c-b137-a5f462d7dd8f
...websocket.chat.ChatManager : Sending reply to: 8eee251d-2777-430c-b137-a5f462d7dd8f
..m.s.u.UserDestinationMessageHandler : Translated /user/8eee251d-2777-430c-b137-a5f462d7dd8f/chat -> [/chat-userd480e89a-813b-7776-23e0-6a0e34e9c70c]