2012-01-23 10 views
6

me gustaría crear una fuente de los manipuladores como:Netty - Cómo pasar información entre los controladores de la misma tubería

public ChannelPipeline getPipeline() throws Exception 
{ 
    return Channels.pipeline(
      new ObjectEncoder(), 
      new ObjectDecoder(), 
      new AuthenticationServerHandler(), 
      new BusinessLogicServerHandler()); 
} 

La clave aquí es que me gustaría que el AuthenticationServerHandler a ser capaz de pasar la información de inicio de sesión al BusinessLogicServerHandler.

Entiendo que puede utilizar un Attachment, sin embargo, que solo almacena la información para ese manejador, los otros controladores en la tubería no pueden acceder a él. También noté que había algo llamado ChannelLocal que podría hacer el truco, sin embargo, no puedo encontrar ninguna información real sobre cómo usarlo. Todo lo que he visto es que las personas crean una instancia estática, ¿pero cómo recuperas y accedes a la información en otro controlador? Suponiendo que ese es el método correcto.

Mi pregunta es: cómo se pasa la información entre los controladores en la misma línea. En el ejemplo anterior, ¿cómo paso las credenciales de inicio de sesión del AuthenticationServerHandler al BusinessLogicServerHandler?

Respuesta

2

ChannelLocal es el camino a seguir. Simplemente cree una instancia estática en algún lugar y acceda a ella desde sus controladores pasando el canal al método set/get. De esta forma puedes compartir cosas entre tus canales.

+1

Eso es lo que entendí (más o menos en concepto), pero no he encontrado ejemplos en ningún lugar sobre cómo hacerlo exactamente. Todavía estoy un poco confuso con los detalles ... –

+1

Ya no lo usaremos en Apache James Protocols, pero creo que se puede obtener la idea del código anterior: http://svn.apache.org/viewvc /james/protocols/tags/protocols-1.5/impl/src/main/java/org/apache/james/protocols/impl/ChannelAttributeSupport.java?view=markup http://svn.apache.org/viewvc/ james/protocols/tags/protocols-1.5/impl/src/main/java/org/apache/james/protocols/impl/AbstractChannelUpstreamHandler.java? view = markup –

+0

Aquí hay un ejemplo de ChannelLocal. http://stackoverflow.com/questions/8449663/usage-of-nettys-channellocal – Veebs

2

yo no era un fan de la implementación ChannelLocal con la falta de un mapa estático interno, por lo que lo que terminó haciendo fue poner mi objeto en el apego del Canal de momento:

ctx.getChannel().setAttachment(myobj); 

Entonces hago "myobj" básicamente un contexto POJO que contiene toda la información recopilada sobre la solicitud hasta el momento.

public class RequestContext { 
    private String foo = ""; 

    public String getFoo(){ 
     return foo; 
    } 
    public void setFoo(String foo){ 
     this.foo = foo; 
    } 

} 

RequestContext reqCtx = new RequestContext(); 
reqCtx.setFoo("Bar"); 

ctx.getChannel().setAttachment(reqCtx); 
reqCtx = (RequestContext)ctx.getChannel().getAttachment(); 

No es elegante, pero funciona ...

+0

Sí, pero el archivo adjunto no atravesar a los otros manejadores en su tubería, que es el problema que estoy teniendo. –

+2

El adjunto en el canal sí lo hace. Lo estoy usando ahora y funciona bien. Va a donde va el canal. –

0

que pase la información de un controlador a los próximos queridos mediante el uso de instancias dedicadas a componer la tubería para cada canal, y teniendo como referencia el manipuladores de cada uno otros dentro de cada tubería.

El paso de la información se realiza de la manera antigua, muy simple, sin ningún problema.

+1

Una pequeña muestra de código sería muy útil. –

Cuestiones relacionadas