Я работаю над сервером приложений, часть которого будет основана на Netty 4.0. Однако я столкнулся с проблемой общих переменных для канала.
Я прочитал, что использовать такие переменные в других обработчиков контекстных мне нужно использоватьИспользование атрибутов каналов в обработчиках различных контекстов
- context.channel(). Атр (ключ) .set()
вместо того, чтобы просто
- context.attr (ключ) .set()
присоединить мои переменный текущий канал.
Как здесь:
public class HadlePackets extends ChannelInboundHandlerAdapter {
private static final Logger LOG = LoggerFactory.getLogger(HadlePackets.class);
public AttributeKey<Integer> clientIDattrKey = new AttributeKey<Integer> ("ClientID");
@Override
public void channelRead(ChannelHandlerContext ctx, Object message) throws Exception {
...
ctx.channel().attr(clientIDattrKey).set(IDnum); //bind ID to channel
...
}
}
Но, как я получить значение переменной в другом контексте обработчика? Ключ атрибута по-прежнему необходим, и я не могу его захватить у обработчика, который подключил переменную.
public class StorageHandler extends ChannelInboundHandlerAdapter{
private static final Logger LOG = LoggerFactory.getLogger(StorageSaveHandler.class);
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Integer clientID = (Integer)ctx.channel().attr(null).get(); //How can i get proper key for this channel attribute?
ctx.fireChannelInactive();
}
Это действительно статично. Это была моя ошибка. Мне нужен уникальный идентификатор для каждого подключенного клиента, поэтому он не должен быть статическим. Но для каждого нового клиентского канала netty создаст новый экземпляр каждого ChanelContextHandler. Связаны ли они вокруг одного канала, и если я вызову обработчик A из обработчика B, он вызовет обработчик для того же канала, где будет обработчик B? – Asprelis
нет, нет. это просто ключ, который статичен. Он может оставаться таким. У вас должен быть доступ к атрибуту, специфичному для канала, если вы установите его в свой метод channelRead (как и вы) и снова получите его в свой метод 'channelInactive' –
отредактированный ответ и добавленный пример. –