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