Mehrere WebSocket-Instanzen in Spring Boot dynamisch bereitstellen

Raphael_

Aktives Mitglied
Hi,
ich möchte in meinem Spring Boot Projekt mehrere Websockets zur Verfügung stellen, die parallel Daten senden können. Das Problem, dass ich habe ist, dass ich zum Start der Anwendung nicht weiß, wieviele ich benötige, also kann ich ja nicht mit einer Bean arbeiten.

Das hier ist meine Config. Ich weiß nicht genau, ob ich hier das @Configuration nutzen darf, weil das ja wieder eine Bean injeziert, aber ohne crasht meine Anwendung direkt.

Java:
@EnableWebSocket
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {

    private WebSocketHandlerRegistry registry;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        this.registry = registry;
    }

    @Bean
    public WebSocketEndpointRegistrar webSocketEndpointRegistrar() {
        return new WebSocketEndpointRegistrar(registry);
    }
}

Dann habe ich hier eine WebsocketEndpointRegistrar Klasse:

Code:
public class WebSocketEndpointRegistrar {

private final WebSocketHandlerRegistry registry;

@Autowired
    public WebSocketEndpointRegistrar(WebSocketHandlerRegistry registry) {
this.registry = registry;
    }

public void registerWebSocketHandler(WebSocketHandler handler, StockType stockType, String timeFrame) {
String path = "/ws/crypto/" + stockType + "/" + timeFrame;
registry.addHandler(handler, path).setAllowedOrigins("*");
    }
}


Und hier meinen Handler:

Code:
@Component
public class WebSocketHandler extends TextWebSocketHandler {

    private final Set<WebSocketSession> sessions = Collections.newSetFromMap(new ConcurrentHashMap<>());

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    public void sendMessageToAll(String klineSummaryAsJson) {
        for (WebSocketSession session : sessions) {
            try {
                session.sendMessage(new TextMessage(klineSummaryAsJson));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


Und in dieser Funktion versuche ich dann die verschiedenen Instanzen zu erstellen eben je nach StockType und TimeFrame soll ein anderer Websocket eröffnet werden:


Code:
public void startWebsocketConnections() {
        List<StockWebsocketConfiguration> configurations = stockWebsocketConfigurationService.getAllWebsocketConfigurations();

        for (StockWebsocketConfiguration config : configurations) {
            try {
                WebSocketHandler handler = new WebSocketHandler();
                webSocketEndpointRegistrar.registerWebSocketHandler(handler, config.getStockType(), config.getTimeFrame());
                webSocketClient.start();
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
    }


Innerhalb der for Schleife erstelle ich dann immer wieder Instanzen, das klappt aber nicht, ich glaube, dass das an Beans liegt, da diese ja beim Start der Anwendung initialisiert werden.
 

Neue Themen


Oben