Netty - как передавать информацию между обработчиками в одном конвейере - PullRequest
6 голосов
/ 23 января 2012

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

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

Ключ в том, что я бы хотел, чтобы AuthenticationServerHandler мог передавать информацию для входа в систему BusinessLogicServerHandler.

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2012

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

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

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

2 голосов
/ 23 января 2012

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

0 голосов
/ 26 марта 2012

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

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

...