2009-02-16 13 views
5

Oggi ho corretto un bug in un'applicazione che poteva portare a un ciclo infinito in un ciclo di richiesta/risposta di servlet.Loop infinito in una servlet - il recupero è possibile?

Quindi, solo per curiosità: cosa succede se il mio servlet viene effettivamente intrappolato in un ciclo for (;;)?

È in qualche modo possibile recuperare? Tomcat lo scoprirà? Questa istanza può essere uccisa senza riavviare il server?

O è questa una delle peggiori cose che può accadere e un modo molto rapido per uccidere un webcontainer?

EDIT: È stato un vero ciclo infinito che consuma CPU tutto il tempo ma non la memoria. L'ho tenuto acceso per alcuni minuti. Penso, posso confermare che Tomcat non rileverà questo tipo di cose :-)

risposta

1

Non credo che Tomcat rilevi un loop infinito. Potrebbe essere possibile interrompere il servlet utilizzando il gestore Tomcat, se il servlet non sta consumando tutta la CPU con il relativo ciclo. In caso contrario, è probabilmente più semplice e sicuro riavviare il server.

Questo è il motivo per cui si fa numerosi test a livello locale prima di distribuire le tue applicazioni ;-) e stare molto attenti che tutti i loop hanno condizioni di uscita ...

+0

Diciamo che questo bug è stato rilevato prima che causasse problemi di produzione ;-) –

+0

buono! E di certo non volevo sembrare assolutamente accondiscendente - sono sicuro che tu conosci l'importanza dei test. –

+0

Non preoccuparti - non l'hai fatto –

1

Non sono sicuro che Tomcat abbia tale rilevamento, ma ad esempio il contenitore Web di Websphere. Tuttavia, ovviamente il contenitore impiega un tempo relativamente lungo per rilevare un thread "sospeso". Server sotto un carico può essere facilmente e rapidamente ucciso da tale codice.

+0

Ehi, bello sapere che websphere rileva qualcosa di simile. Grazie per le informazioni –

1

se il ciclo infinito è causato da un redirect senza fine, lo farà prima o poi chiudi quella richiesta con StackOverflowException.

Si tratta di un "vero" ciclo infinito, si può incorrere in una CPU/core in modo permanente e infine si blocca l'intera app con OutOfMemoryException.

tomcat ha, per quanto ne so, nessun rilevamento esplicito per questi problemi.

0

mi immagino che si potrebbe gestire questo con un'impostazione di timeout appropriato:

http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html

+0

Hm ... sei sicuro? Ho letto il documento che hai linkato e non vedo come quei timer possano rilevare una discussione "bloccata" (fondamentalmente in live-lock). Per favore correggimi se sbaglio! –

+0

I timeout di duffymo collegati sono per il connettore JK, che collega Tomcat ad Apache. Quindi no, probabilmente non ti aiuteranno. –