Elegant håndtering av WebSocket-feil
Implementer robuste mekanismer for feilhåndtering av både server- og klientsidefeil i WebSocket.
Elegant håndtering av WebSocket-feil er en gratis leksjon i WebSockets og sanntidssystemer med Spring på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i WebSockets og sanntidssystemer med Spring, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i WebSockets og sanntidssystemer med Spring inneholder totalt 4 leksjoner.
Introduksjon til WebSocket-feil
Sanntidsapplikasjoner som bruker WebSockets, trenger robust feilhåndtering. Akkurat som i all annen programvare kan ting gå galt!
Det er avgjørende å forstå feil og håndtere dem på en god måte for å sikre en god brukeropplevelse og en stabil applikasjon. I denne leksjonen ser vi på vanlige feiltyper og hvordan De kan håndtere dem effektivt.
Feiltyper på klientsiden
Det kan oppstå feil på klientsiden (for eksempel i en nettleser eller mobilapp) av flere årsaker:
- Nettverksproblemer: Internettforbindelsen er brutt eller blokkeres av en brannmur.
- Serverproblemer: Serverkrasj eller uhåndterte unntak på serversiden.
- Protokollbrudd: Det sendes data i feil format som serveren avviser.
- Logikk på klientsiden: Feil i behandlingen av mottatte meldinger.
Dette viser seg ofte som at forbindelsen brytes, eller at meldinger ikke kan sendes eller mottas.
Håndtering av klientens «onerror»-hendelse
I JavaScript tilbyr WebSocket-API-et en onerror-hendelseslytter. Denne hendelsen utløses når det oppstår en kommunikasjonsfeil.
Selv om onerror viser at det har oppstått et problem, gir den ofte ikke detaljert informasjon. Den etterfølges vanligvis av en onclose-hendelse, som gir mer spesifikke statuskoder og årsaker til at forbindelsen ble avsluttet.
Eksempel på feilhåndtering på klientsiden
Slik kan De sette opp grunnleggende behandlere for feil og lukking på klientsiden ved hjelp av JavaScript:
Legg merke til hvordan onclose gir mer kontekst gjennom 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.Feilscenarier på serversiden
På serveren, særlig i en Spring WebSocket-applikasjon, kan feil oppstå på grunn av:
- Meldingsbehandling: Unntak som kastes av
@MessageMapping-metodene. - Autentisering/autorisasjon: Sikkerhetsfeil som hindrer levering av meldinger.
- Meglerproblemer: Problemer med å koble til eller kommunisere med en ekstern STOMP-meldingsmegler.
- Transportfeil: Lavnivåproblemer i nettverket eller protokollbrudd (for eksempel feilformaterte rammer).
Ved å håndtere disse feilene unngår De serverkrasj og kan gi klientene nyttig tilbakemelding.
Feilhåndtering i Spring WebSocket
Spring tilbyr effektive mekanismer for å håndtere WebSocket-feil på serversiden:
@MessageExceptionHandler: For unntak som oppstår under behandling av STOMP-meldinger i kontrollerne.WebSocketHandlerDecoratorFactory: For å fange opp og håndtere feil knyttet til WebSocket-forbindelsens livssyklus og transport.
Disse mekanismene lar Dem samle feillogikken på ett sted og svare på en hensiktsmessig måte.
Bruk av @MessageExceptionHandler
Annotasjonen @MessageExceptionHandler fungerer på samme måte som @ExceptionHandler i REST-kontrollere. Den fanger opp unntak som kastes av metoder merket med @MessageMapping.
De kan definere metoder som håndterer bestemte unntakstyper og sender en egendefinert feilmelding tilbake til klienten, ofte til et eget feilemne.
Prøv å sende en melding som inneholder "error" for å se unntakshåndtereren i bruk.
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
For feil som oppstår utenfor bestemte @MessageMapping-metoder, for eksempel lavnivå-transportfeil eller problemer under oppretting eller avslutning av forbindelsen, kan De bruke en WebSocketHandlerDecoratorFactory.
Denne fabrikken lar Dem pakke inn standard-WebSocketHandler med Deres egen logikk. Da kan De fange opp hendelser som handleTransportError eller afterConnectionClosed for robust logging eller egendefinerte svar.
Implementering av en dekoratør
Her er et eksempel på implementering av en WebSocketHandlerDecoratorFactory. Den pakker inn standardbehandleren for å legge til egendefinert logging av tilkoblingshendelser og transportfeil.
Dette lar Dem reagere på problemer som kanskje ikke fanges opp av @MessageExceptionHandler, for eksempel at en klient plutselig kobler fra.
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);
}
};
}
}Anbefalte fremgangsmåter for feilhåndtering
Vurder disse anbefalte fremgangsmåtene for å bygge virkelig robuste WebSocket-applikasjoner:
- Loggfør alt: Bruk et robust rammeverk for logging (for eksempel SLF4J/Logback) til å registrere alle feil, advarsler og viktige hendelser.
- Tilbakemelding til brukeren: Vis tydelige og brukervennlige meldinger på klientsiden når det oppstår feil, og unngå teknisk sjargong.
- Gradert funksjonalitet: Sørg for at resten av applikasjonen fortsatt fungerer hvis en bestemt funksjon svikter.
- Egendefinerte feilmeldinger: Ikke eksponer rå stacktracer eller interne serverdetaljer for klientene.
- Overvåking: Implementer overvåkingsverktøy for å følge med på tilkoblingenes tilstand og feilraten.
Utfordring i feilhåndtering
De har lært om ulike måter å håndtere WebSocket-feil på, både på klienten og serveren. La oss teste forståelsen Deres!
Oppsummering: God feilhåndtering
I denne leksjonen utforsket vi det viktige temaet håndtering av WebSocket-feil. Vi gikk gjennom:
- Vanlige feil på klientsiden og hvordan
onerrorogonclosebrukes. - Feilscenarier på serversiden i Spring.
- Bruk av
@MessageExceptionHandlerved feil under behandling av STOMP-meldinger. - Implementering av
WebSocketHandlerDecoratorFactoryfor feil i forbindelsens livssyklus og transport. - Viktige anbefalte fremgangsmåter for å bygge robuste og feiltolerante sanntidsapplikasjoner.
Det er avgjørende å beherske feilhåndtering for å kunne lage pålitelige og brukervennlige WebSocket-tjenester.
Lær deg WebSockets og sanntidssystemer med Spring med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Elegant håndtering av WebSocket-feil» gratis?
Ja – hele teksten i «Elegant håndtering av WebSocket-feil» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av WebSockets og sanntidssystemer med Spring-kurset, kan du oppgradere til CoddyKit PRO. Kurset i WebSockets og sanntidssystemer med Spring inneholder totalt 4 leksjoner.
Hva lærer jeg i «Elegant håndtering av WebSocket-feil»?
Implementer robuste mekanismer for feilhåndtering av både server- og klientsidefeil i WebSocket. Du øver på WebSockets og sanntidssystemer med Spring med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med WebSockets og sanntidssystemer med Spring?
Ingen tidligere erfaring er nødvendig. WebSockets og sanntidssystemer med Spring på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Elegant håndtering av WebSocket-feil»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne WebSockets og sanntidssystemer med Spring-leksjonen?
Ja. Alle WebSockets og sanntidssystemer med Spring-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Elegant håndtering av WebSocket-feil
- Håndtering av tilkoblingens livssyklus
- Nye forsøk og reserveløsninger
- Heartbeats og ping/pong-keep-alive