2012-01-23 13 views
6

vorrei creare una pipeline di gestori quali:Netty - Come passare informazioni tra i gestori nella stessa conduttura

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

La chiave qui è che mi piacerebbe il AuthenticationServerHandler di essere in grado di passare le informazioni di accesso allo BusinessLogicServerHandler.

Capisco che è possibile utilizzare uno Attachment, tuttavia questo memorizza solo le informazioni per quel gestore, gli altri gestori della pipeline non possono accedervi. Ho anche notato che c'era qualcosa chiamato ChannelLocal che potrebbe fare il trucco, tuttavia non riesco a trovare alcuna informazione reale su come usarlo. Tutto quello che ho visto è che le persone creano un'istanza statica su di esso, ma come recuperare e accedere alle informazioni in un altro gestore? Supponendo che sia il metodo corretto.

La mia domanda è: come si passano le informazioni tra gestori nella stessa pipeline. Nell'esempio sopra, come faccio a passare le credenziali di accesso dallo AuthenticationServerHandler allo BusinessLogicServerHandler?

risposta

2

ChannelLocal è la soluzione giusta. Basta creare un'istanza statica da qualche parte e quindi accedervi dall'interno dei gestori passando il canale al metodo set/get. In questo modo puoi condividere contenuti tra i tuoi canali.

+1

Questo è quello che ho capito (più o meno nel concetto), ma non ho trovato alcun esempio su come esattamente esattamente come farlo. Sono ancora un po 'confuso sui dettagli ... –

+1

Non lo usiamo più nei protocolli Apache James ma penso che tu possa ottenere l'idea dal vecchio codice: 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/protocolli/tag/protocolli-1.5/impl/src/main/java/org/apache/james/protocolli/impl/AbstractChannelUpstreamHandler.java? view = markup –

+0

Ecco un esempio per ChannelLocal. http://stackoverflow.com/questions/8449663/usage-of-nettys-channellocal – Veebs

2

Non ero un fan della realizzazione ChannelLocal con la mancanza di una mappa statica interna, così quello che ho finito per fare è stato mettere il mio oggetto l'attaccamento del canale per ora:

ctx.getChannel().setAttachment(myobj); 

Poi faccio "myobj" fondamentalmente un POJO di contesto che contiene tutte le informazioni raccolte sulla richiesta fino ad ora.

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(); 

Non è elegante, ma funziona ...

+0

Sì ma l'allegato non attraversare gli altri gestori nella tua pipeline, che è il problema che sto avendo. –

+2

L'allegato sul canale fa. Lo sto usando ora e funziona bene. Va ovunque vada il canale. –

0

mi passano le informazioni da un gestore per i successivi utilizzando le istanze dedicate a comporre la pipeline per ogni canale, e avendo i gestori di riferimento ogni altri all'interno di ogni condotta.

Il passaggio di informazioni è reso alla vecchia maniera, molto semplicemente, senza alcun problema.

+1

Un piccolo esempio di codice farebbe molto. –

Problemi correlati