Anonymous
Die Frühlings -Websocket -Nachricht übergibt nicht an @MessAgemappings auf Stomp Connection
Post
by Anonymous » 14 Sep 2025, 11:11
Ich verwende Spring Boot mit Stomp Over WebSocket. Die Stomp-Verbindung wird nicht erfolgreich festgelegt, und Nachrichten, die vom Client gesendet werden
Code: Select all
@Controller
@Slf4j
@MessageMapping("/api/v1")
public class LeaderboardController {
private final ScoreServiceImpl scoreServiceImpl;
private final SimpMessagingTemplate simpMessagingTemplate;
LeaderboardController(ScoreServiceImpl scoreServiceImpl, SimpMessagingTemplate simpMessagingTemplate) {
this.scoreServiceImpl = scoreServiceImpl;
this.simpMessagingTemplate = simpMessagingTemplate;
}
@MessageMapping("/leaderboard/{lb}")
public void changes(@Payload Message request, @DestinationVariable String lb, Principal principal){
log.info("Saving scores for {}", request);
ScoreResponse scoreResponse = scoreServiceImpl.saveScore(request.getPayload(), lb);
simpMessagingTemplate.convertAndSend("/topic/leaderboard/" + lb, scoreResponse);
simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/queue/my-score/" + lb, scoreResponse);
log.info("pushed messages for {}", request);
}
}
Client mit WebSocket King-Client:
Code: Select all
CONNECT
accept-version:1.2
host:localhost
^@
SUBSCRIBE
id:sub-0
destination:/topic/update/racers
^@
SEND
destination:/api/v1/leaderboard/racers
content-type:application/json
{"name":"alex","score":42} ^@
WebSocket-Konfiguration:
Code: Select all
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/api/v1");
registry.enableSimpleBroker("/topic", "/queue");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/web-socket/connect")
.addInterceptors(new CustomHandshakeInterceptorFromQuery())
.setHandshakeHandler(new CustomUsernameFromQueryHandshakeHandler())
.setAllowedOriginPatterns("*")
// .withSockJS()
;
}
@Bean
public SimpMessagingTemplate simpMessagingTemplate(MessageChannel clientOutboundChannel){
return new SimpMessagingTemplate(clientOutboundChannel);
}
}
Benutzerdefinierte Interceptor und Handshake-Handler sind Registrierungsbenutzer ohne harte Sicherheitslogik und tun genau, wie sie benannt sind.
Code: Select all
[MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
1757841098
Anonymous
Ich verwende Spring Boot mit Stomp Over WebSocket. Die Stomp-Verbindung wird nicht erfolgreich festgelegt, und Nachrichten, die vom Client gesendet werden[code]@Controller @Slf4j @MessageMapping("/api/v1") public class LeaderboardController { private final ScoreServiceImpl scoreServiceImpl; private final SimpMessagingTemplate simpMessagingTemplate; LeaderboardController(ScoreServiceImpl scoreServiceImpl, SimpMessagingTemplate simpMessagingTemplate) { this.scoreServiceImpl = scoreServiceImpl; this.simpMessagingTemplate = simpMessagingTemplate; } @MessageMapping("/leaderboard/{lb}") public void changes(@Payload Message request, @DestinationVariable String lb, Principal principal){ log.info("Saving scores for {}", request); ScoreResponse scoreResponse = scoreServiceImpl.saveScore(request.getPayload(), lb); simpMessagingTemplate.convertAndSend("/topic/leaderboard/" + lb, scoreResponse); simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/queue/my-score/" + lb, scoreResponse); log.info("pushed messages for {}", request); } } [/code] [b] Client mit WebSocket King-Client: [/b] [code]CONNECT accept-version:1.2 host:localhost ^@ SUBSCRIBE id:sub-0 destination:/topic/update/racers ^@ SEND destination:/api/v1/leaderboard/racers content-type:application/json {"name":"alex","score":42} ^@ [/code] [b] WebSocket-Konfiguration: [/b] [code]@Slf4j @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/api/v1"); registry.enableSimpleBroker("/topic", "/queue"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/web-socket/connect") .addInterceptors(new CustomHandshakeInterceptorFromQuery()) .setHandshakeHandler(new CustomUsernameFromQueryHandshakeHandler()) .setAllowedOriginPatterns("*") // .withSockJS() ; } @Bean public SimpMessagingTemplate simpMessagingTemplate(MessageChannel clientOutboundChannel){ return new SimpMessagingTemplate(clientOutboundChannel); } } [/code] Benutzerdefinierte Interceptor und Handshake-Handler sind Registrierungsbenutzer ohne harte Sicherheitslogik und tun genau, wie sie benannt sind.[code][MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0] [/code]