Netty - как передавать информацию между обработчиками в одном конвейере

Я хотел бы создать конвейер обработчиков, таких как:

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

ключ здесь в том, что я хотел бы AuthenticationServerHandler чтобы иметь возможность передать данные для входа в BusinessLogicServerHandler.

Я понимаю, что вы можете использовать Attachment, однако это только хранит информацию для этого обработчика, другие обработчики в конвейере не могут получить к нему доступ. Я также заметил, что было что-то под названием ChannelLocal что может сделать трюк, но я не могу найти никакой реальной информации о том, как использовать его. Все, что я видел, это люди создают статический экземпляр, но как вы получаете и получаете доступ к информации в другом обработчике? Предполагая, что это правильный метод.

мой вопрос: как вы передаете информацию между обработчиками в одном конвейере. В приведенном выше примере, как передать учетные данные для входа из AuthenticationServerHandler до BusinessLogicServerHandler?

3 ответов


ChannelLocal-это путь к atm. Просто создайте статический экземпляр где-нибудь, а затем получите к нему доступ из ваших обработчиков, передав канал методу set/get. Таким образом, вы можете делиться вещами между вашими каналами.


Я не был поклонником реализации ChannelLocal с отсутствием внутренней статической карты, поэтому в конечном итоге я поставил свой объект на вложение канала:

ctx.getChannel().setAttachment(myobj);

затем я делаю "myobj" в основном контекстным POJO, который содержит всю информацию, собранную о запросе до сих пор.

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

это не элегантно, но это работает...


Я передаю информацию от одного обработчика к следующему, используя выделенные экземпляры для создания конвейера для каждого канала и имея обработчики, ссылающиеся друг на друга в каждом конвейере.

передача информации производится старым способом, очень просто, без каких либо проблем.