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


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

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

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

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

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

3 ответа:

ChannelLocal является способом пойти в банкомате. Просто создайте статический экземпляр где-нибудь, а затем получите к нему доступ из ваших обработчиков, передав канал методу 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(); 

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

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

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