BAEL-4648: How to debug Websockets (#11469)

* BAEL-4648: How to debug Websockets

* Formatted the code

* Incorporated comments from Kevin
This commit is contained in:
Bhaskara
2021-11-29 05:02:23 +05:30
committed by GitHub
parent 6f87f6edd5
commit 28b7ea96c7
7 changed files with 248 additions and 2 deletions
@@ -0,0 +1,39 @@
package com.baeldung.debugwebsockets;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
@Controller
public class StockTicksController {
private final SimpMessagingTemplate simpMessagingTemplate;
public StockTicksController(SimpMessagingTemplate simpMessagingTemplate) {
this.simpMessagingTemplate = simpMessagingTemplate;
}
@Scheduled(fixedRate = 3000)
public void sendTicks() {
simpMessagingTemplate.convertAndSend("/topic/ticks", getStockTicks());
}
private Map<String, Integer> getStockTicks() {
Map<String, Integer> ticks = new HashMap<>();
ticks.put("AAPL", getRandomTick());
ticks.put("GOOGL", getRandomTick());
ticks.put("MSFT", getRandomTick());
ticks.put("TSLA", getRandomTick());
ticks.put("AMZN", getRandomTick());
ticks.put("HPE", getRandomTick());
return ticks;
}
private int getRandomTick() {
return ThreadLocalRandom.current().nextInt(-100, 100 + 1);
}
}
@@ -0,0 +1,31 @@
package com.baeldung.debugwebsockets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.messaging.simp.stomp.StompSession;
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
import java.lang.reflect.Type;
import java.util.Map;
public class StompClientSessionHandler extends StompSessionHandlerAdapter {
private static final Logger logger = LoggerFactory.getLogger("StompClientSessionHandler");
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
logger.info("New session established. Session Id -> {}", session.getSessionId());
session.subscribe("/topic/ticks", this);
logger.info("Subscribed to topic: /topic/ticks");
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
logger.info("Payload -> {}", payload);
}
@Override
public Type getPayloadType(StompHeaders headers) {
return Map.class;
}
}
@@ -0,0 +1,24 @@
package com.baeldung.debugwebsockets;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.messaging.simp.stomp.StompSessionHandler;
import org.springframework.web.socket.client.WebSocketClient;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;
import java.util.Scanner;
public class StompWebSocketClient {
private static final String URL = "ws://localhost:8080/stock-ticks/websocket";
public static void main(String[] args) {
WebSocketClient client = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
StompSessionHandler sessionHandler = new StompClientSessionHandler();
stompClient.connect(URL, sessionHandler);
new Scanner(System.in).nextLine();
}
}
@@ -0,0 +1,13 @@
package com.baeldung.debugwebsockets;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebsocketApplication {
public static void main(String[] args) {
SpringApplication.run(WebsocketApplication.class, args);
}
}
@@ -0,0 +1,25 @@
package com.baeldung.debugwebsockets;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stock-ticks").setAllowedOriginPatterns("*").withSockJS();
}
}