Pregunta

La documentación de Netty sugiere usar variables de instancia en ChannelHandlers para realizar un seguimiento del estado del canal. No menciona que debe usar variables volátiles o usar cualquier otra técnica de sincronización para asegurar que haya una vista consistente entre los hilos.

Por ejemplo, usar este manejador en una base por conexión:

class Handler extends SimpleChannelUpstreamHandler {
        int count = 0;

        @Override
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
            ++count;
        }
}

Esperaría que muchos hilos diferentes de un grupo de hilos Netty llamen a este método, aunque no simultáneamente, y podría ver una visión inconsistente, lo que resulta en un recuento inexacto.

¿Es este el caso? ¿O hay algún tipo de sincronización dentro de Netty que causaría que la escritura en el campo del conteo se descarte?

¿Fue útil?

Solución

Si no tiene un albacea en su tubería y está ejecutando sus manejadores exclusivamente en los hilos de trabajadores de E/S, entonces está bien como Netty garantiza que una instancia de tubería determinada siempre se vuelva a llamar del mismo hilo del trabajador.

Si está agregando un controlador de ejecución a su tubería, entonces está bien si está utilizando Netty's OrderedMemoryAwarethreadPoolExecutor.

Si está accediendo a su tubería desde un hilo no netty, o tiene un MemoryAwarethreadPoolExecutor no ordenado en su tubería, entonces necesita sincronización.

Recomiendo echar un vistazo a los siguientes hilos en los Archivos del Foro de Usuarios de Netty.

http://netty.markmail.org/search/?q=memory+visibility+in+handlers#query:Memory%20Visibility%20in%20Handlers+Page:1+Mid:CMTW5OMCXBG67SHO+State:Results

http://netty.markmail.org/search/?q=periodic%20timerTask%20in#Query:Periodic%20TimerTask%20in+Page:2+Mid:VWAHEPIOIS4EQWKP+STATE:RESULTS

Otros consejos

Cuando creas un Netty ChannelPipeline Si agrega el mismo instancia de tu Handler A todos los canales, sí, múltiples hilos leerán/modificarán sus datos.

Si crea una nueva instancia de Handler por canal en su tubería como se muestra a continuación, entonces está a salvo, solo un hilo accederá al manejador en el tubería A la vez entonces.

ChannelPipeline p = Channels.pipeline();
pipeline.addLast("handler", new Handler());

También eche un vistazo a Netty Canalocal, es como Java ThreadLocal y puede establecer el estado por canal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top