2012-04-03 10 views
11

in particolare sono interessato al caso in cui l'altra estremità del canale muore in modo imprevisto (ad esempio il processo viene ucciso). sembra che netty non licenzi in modo affidabile un evento di chiusura/disconnessione del canale, a volte lo fa e altre volte no. inoltre, non genera necessariamente una SocketException per la reimpostazione della connessione.può rilevare in modo affidabile la chiusura/disconnessione del canale?

per quello che vale, ho anche provato a scrivere sul canale ma anche questo continua a funzionare senza generare eccezioni o sparare a nessun altro evento.

sto testando questo su Windows, con netty 3.3.0.Final, se questo fa alcuna differenza.

risposta

5

In alcuni casi, come hai affermato, netty non è in grado di rilevare se il canale è chiuso o meno. Here è lo stesso problema menzionato in questa domanda. Un modo per risolvere il problema sta usando heartbeat messages. Netty supporta il battito cardiaco con IdleStateHandler.

Inoltre, si potrebbe rivedere questi riferimenti per IdleStateHandler:

+0

un problema è che Netty continua allegramente a scrivere su un canale che è stato chiuso all'altra fine. è l'unico modo per rilevare in modo affidabile il canale su heartbeat e aspettarsi una risposta? –

+0

Se si cola manualmente la connessione, dovrebbe funzionare. Potrebbe esserci un modo alternativo per rilevare la disconnessione, ma questo è il documento per netty. Il mio secondo suggerimento è controllare e leggere sul metodo setReadable e isWritable di Channel. Puoi controllare lo stato del canale con Channel.isWritable all'interno del produttore e rendere leggibile il canale con Channel.setReadable all'interno del consumer. Non sono sicuro, ma quest'ultimo trucco potrebbe funzionare. – ozhan