Robust håndtering af WebSocket-fejl
Implementer robuste mekanismer til håndtering af både server- og klientsidefejl i WebSockets.
Robust håndtering af WebSocket-fejl er en gratis WebSockets og realtidssystemer med Spring-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i WebSockets og realtidssystemer med Spring, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.
Introduktion til WebSocket-fejl
Realtidsapplikationer, der anvender WebSockets, har brug for robust fejlhåndtering. Ligesom i al anden software kan ting gå galt!
Det er afgørende at forstå fejl og håndtere dem på en hensigtsmæssig måde for at sikre en problemfri brugeroplevelse og en stabil applikation. I denne lektion gennemgår du almindelige fejltyper og lærer, hvordan du håndterer dem effektivt.
Fejltyper på klientsiden
Der kan opstå fejl på klientsiden (f.eks. i en browser eller mobilapp) af forskellige årsager:
- Netværksproblemer: Afbrudt internetforbindelse eller blokeringer i en firewall.
- Serverproblemer: Servernedbrud eller uhåndterede undtagelser på serversiden.
- Protokolovertrædelser: Afsendelse af forkert formaterede data, som serveren afviser.
- Logik på klientsiden: Fejl i behandlingen af modtagne meddelelser.
Det viser sig ofte som forbindelsesafbrydelser eller meddelelser, der ikke kan sendes eller modtages.
Håndtering af klientens 'onerror'-hændelse
I JavaScript har WebSocket-API'et en onerror-hændelseslytter. Denne hændelse udløses, når der opstår en kommunikationsfejl.
Selvom onerror angiver, at der er et problem, giver den ofte ikke detaljerede oplysninger. Den efterfølges normalt af en onclose-hændelse, som giver mere specifikke statuskoder og årsager til, at forbindelsen blev afsluttet.
Eksempel på fejlhåndtering på klientsiden
Sådan kan du opsætte grundlæggende fejl- og lukkehåndteringer på klientsiden med JavaScript:
Bemærk, hvordan onclose giver mere kontekst via event.code og event.reason.
const ws = new WebSocket("ws://localhost:8080/my-ws");
ws.onopen = () => {
console.log("Connected!");
};
ws.onmessage = (event) => {
console.log(`Received: ${event.data}`);
};
ws.onerror = (error) => {
console.error("WebSocket Error: ", error);
// This is a generic error, often followed by onclose
};
ws.onclose = (event) => {
if (event.wasClean) {
console.log(`Closed cleanly, code=${event.code}, reason=${event.reason}`);
} else {
console.error(`Connection died, code=${event.code}, reason=${event.reason}`);
// Handle unexpected closure, e.g., attempt reconnect
}
};
// To trigger an error, try connecting to a non-existent port or URL.Fejlsituationer på serversiden
På serveren, især i en Spring WebSocket-applikation, kan fejl opstå på grund af:
- Behandling af meddelelser: Undtagelser, der kastes af dine
@MessageMapping-metoder. - Godkendelse/adgangskontrol: Sikkerhedsfejl, der forhindrer levering af meddelelser.
- Mæglerproblemer: Problemer med at oprette forbindelse til eller kommunikere med en ekstern STOMP-meddelelsesmægler.
- Transportfejl: Lavniveau-netværksproblemer eller protokolovertrædelser (f.eks. forkert formaterede frames).
Håndtering af disse fejl forhindrer servernedbrud og giver klienterne meningsfuld feedback.
Fejlhåndtering i Spring WebSocket
Spring indeholder effektive mekanismer til håndtering af WebSocket-fejl på serversiden:
@MessageExceptionHandler: Til undtagelser, der opstår under behandling af STOMP-meddelelser i dine controllere.WebSocketHandlerDecoratorFactory: Til at opfange og håndtere fejl relateret til WebSocket-forbindelsens livscyklus og transport.
Det giver dig mulighed for at samle fejllogikken ét sted og svare korrekt.
Brug af @MessageExceptionHandler
Annotationen @MessageExceptionHandler fungerer på samme måde som @ExceptionHandler i REST-controllere. Den opfanger undtagelser, der kastes af metoder, som er annoteret med @MessageMapping.
Du kan definere metoder, der håndterer bestemte undtagelsestyper og sender en brugerdefineret fejlmeddelelse tilbage til klienten, ofte til et dedikeret fejl-emne.
Prøv at sende en meddelelse, der indeholder "error", for at se undtagelseshåndteringen i aktion.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@SpringBootApplication
public class ErrorHandlingApp {
public static void main(String[] args) {
SpringApplication.run(ErrorHandlingApp.class, args);
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
}
@Controller
class ChatController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public String greeting(String message) throws Exception {
if (message.contains("error")) {
throw new IllegalArgumentException("Message contains 'error' keyword!");
}
return "Hello, " + message + "!";
}
@MessageExceptionHandler
@SendTo("/topic/errors")
public String handleIllegalArgumentException(IllegalArgumentException ex) {
return "Error: " + ex.getMessage();
}
}WebSocketHandlerDecoratorFactory
Til fejl uden for bestemte @MessageMapping-metoder, f.eks. lavniveau-transportfejl eller problemer under oprettelse eller lukning af forbindelsen, kan du bruge en WebSocketHandlerDecoratorFactory.
Denne fabrik gør det muligt at omslutte standard-WebSocketHandler med din egen logik, så du kan opfange hændelser som handleTransportError eller afterConnectionClosed og opnå robust logning eller sende brugerdefinerede svar.
Implementering af en dekoratør
Her er et eksempel på implementering af en WebSocketHandlerDecoratorFactory. Den omslutter standardhåndteringen for at tilføje brugerdefineret logning af forbindelseshændelser og transportfejl.
Det giver dig mulighed for at reagere på problemer, som @MessageExceptionHandler måske ikke opfanger, f.eks. hvis en klient pludselig afbryder forbindelsen.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.handler.WebSocketHandlerDecorator;
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;
@SpringBootApplication
@EnableWebSocket
public class DecoratorApp implements WebSocketConfigurer {
public static void main(String[] args) {
SpringApplication.run(DecoratorApp.class, args);
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/ws-decorator").setAllowedOrigins("*");
}
public WebSocketHandler myHandler() {
return new TextWebSocketHandler() {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("Handler: Connection established for " + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("Handler: Connection closed for " + session.getId() + " with status " + status);
}
};
}
@org.springframework.context.annotation.Bean
public WebSocketHandlerDecoratorFactory decoratorFactory() {
return (handler) -> new WebSocketHandlerDecorator(handler) {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("Decorator: Client connected: " + session.getId());
super.afterConnectionEstablished(session);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.err.println("Decorator: Transport error for session " + session.getId() + ": " + exception.getMessage());
// You could send a generic error message to the client here if session is still open
super.handleTransportError(session, exception);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
System.out.println("Decorator: Client disconnected: " + session.getId() + ", Status: " + closeStatus.getCode());
super.afterConnectionClosed(session, closeStatus);
}
};
}
}Bedste praksis for fejlhåndtering
Overvej følgende bedste praksis, når du bygger virkelig robuste WebSocket-applikationer:
- Log alt: Brug et robust logningsframework (f.eks. SLF4J/Logback) til at registrere alle fejl, advarsler og vigtige hændelser.
- Feedback til brugeren: Giv klare og brugervenlige meddelelser på klientsiden, når der opstår fejl, og undgå teknisk jargon.
- Kontrolleret forringelse: Sørg for, at resten af applikationen fortsat fungerer, hvis en bestemt funktion fejler.
- Brugerdefinerede fejlmeddelelser: Vis aldrig rå stacktraces eller interne serveroplysninger til klienterne.
- Overvågning: Implementer overvågningsværktøjer til at følge forbindelsernes tilstand og fejlhyppigheden.
Udfordring i fejlhåndtering
Du har lært om forskellige måder at håndtere WebSocket-fejl på både klienten og serveren. Lad os teste din forståelse!
Opsummering: Hensigtsmæssig fejlhåndtering
I denne lektion undersøgte vi det vigtige emne fejlhåndtering i WebSockets. Vi gennemgik:
- Almindelige fejl på klientsiden, og hvordan du bruger
onerrorogonclose. - Fejlsituationer på serversiden i Spring.
- Brugen af
@MessageExceptionHandlertil fejl under behandling af STOMP-meddelelser. - Implementering af
WebSocketHandlerDecoratorFactorytil fejl i forbindelsens livscyklus og transport. - Vigtige bedste praksisser til opbygning af robuste realtidsapplikationer, der tåler fejl.
Det er afgørende at mestre fejlhåndtering for at kunne skabe pålidelige og brugervenlige WebSocket-tjenester.
Lær WebSockets og realtidssystemer med Spring med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Robust håndtering af WebSocket-fejl” gratis?
Ja — hele teksten til “Robust håndtering af WebSocket-fejl” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af WebSockets og realtidssystemer med Spring-kurset, skal du opgradere til CoddyKit PRO. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Robust håndtering af WebSocket-fejl”?
Implementer robuste mekanismer til håndtering af både server- og klientsidefejl i WebSockets. Du øver dig i WebSockets og realtidssystemer med Spring med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på WebSockets og realtidssystemer med Spring?
Der kræves ingen tidligere erfaring. WebSockets og realtidssystemer med Spring på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Robust håndtering af WebSocket-fejl”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne WebSockets og realtidssystemer med Spring-lektion?
Ja. Alle WebSockets og realtidssystemer med Spring-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Robust håndtering af WebSocket-fejl
- Håndtering af forbindelsens livscyklus
- Genforsøg og fallback-mekanismer
- Heartbeats og ping/pong-holdalive