2012-01-23 9 views
6

chciałbym stworzyć rurociągu koparki, takich jak:Netty - Jak przekazać informacje pomiędzy obsługą w tym samym rurociągu

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

Kluczem tutaj jest to, że chciałbym się AuthenticationServerHandler, aby móc przejść dane logowania do BusinessLogicServerHandler.

Rozumiem, że można użyć wartości Attachment, jednak tylko przechowuje informacje dla tego modułu obsługi, inne moduły znajdujące się w potoku nie mogą uzyskać do niego dostępu. Zauważyłem też, że jest coś, co może zadziałać, ale nie mogę znaleźć żadnych prawdziwych informacji o tym, jak go użyć. Wszystko, co widziałem, to ludzie tworzą dla niej statyczną instancję, ale w jaki sposób odzyskujesz i uzyskujesz dostęp do informacji w innej procedurze? Zakładając, że to właściwa metoda.

Moje pytanie brzmi: w jaki sposób przekazujesz informacje pomiędzy modułami obsługi w tym samym potoku. W powyższym przykładzie w jaki sposób przekazać dane logowania od AuthenticationServerHandler do BusinessLogicServerHandler?

Odpowiedz

2

ChannelLocal to sposób na bankomaty. Po prostu stwórz gdzieś instancję statyczną, a następnie uzyskaj dostęp do niej za pomocą programów obsługi, przekazując kanał do metody set/get. W ten sposób możesz udostępniać treści między kanałami.

+1

To właśnie zrozumiałem (mniej więcej w koncepcji), ale nie znalazłem żadnych przykładów gdzie dokładnie to zrobić. Nadal jestem trochę nieostry w szczegółach ... –

+1

Nie używamy go już w Apache James Protocols, ale myślę, że możesz uzyskać ten pomysł ze starego kodu: 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/protokoły/tagi/protokoły-1.5/impl/src/main/java/org/apache/james/protocols/impl/AbstractChannelUpstreamHandler.java? view = markup –

+0

Oto przykład dla ChannelLocal. http://stackoverflow.com/questions/8449663/usage-of-nettys-channellocal – Veebs

2

nie byłem fanem ChannelLocal realizacji z brakiem wewnętrznej mapie statycznej, więc co skończyło się robi było umieszczenie mojego obiektu na zajęcia kanału dla teraz:

ctx.getChannel().setAttachment(myobj); 

Potem robię "myobj" w zasadzie POJO kontekstu, który zawiera wszystkie informacje zebrane na temat żądania do tej pory.

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

To nie jest eleganckie, ale działa ...

+0

Tak, ale załącznik nie przechodzić do innych programów obsługi w twoim rurociągu, co jest problemem, który mam. –

+2

Attachment na kanale ma. Używam go teraz i działa dobrze. Idzie tam, gdzie idzie kanał. –

0

przekazać informację od jednego przewodnika do następnych nich za pomocą dedykowanych wystąpień komponować gazociągu dla każdego kanału, a poprzez odniesienie do każdej procedury obsługi inne w każdym rurociągu.

Przekazywanie informacji odbywa się starą drogą, bardzo prosto, bez żadnego problemu.

+1

Mała próbka kodu przeszedłaby długą drogę. –