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();
это не элегантно, но это работает...
Я передаю информацию от одного обработчика к следующему, используя выделенные экземпляры для создания конвейера для каждого канала и имея обработчики, ссылающиеся друг на друга в каждом конвейере.
передача информации производится старым способом, очень просто, без каких либо проблем.