Сохранение состояния в Netty Channelhandler
-
25-10-2019 - |
Вопрос
Документация Netty предполагает использование переменных экземпляра в каналах -руках для отслеживания состояния канала. Он не упоминает, что вы должны использовать летучие переменные или использовать любую другую методику синхронизации, чтобы гарантировать, что существует последовательный вид в разных потоках.
Например, используя этот обработчик на основе подключения:
class Handler extends SimpleChannelUpstreamHandler {
int count = 0;
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
++count;
}
}
Я ожидаю, что много разных потоков из пула ниток Netty будут вызывать этот метод, хотя и не одновременно, и потенциально могут увидеть непоследовательный взгляд, что приведет к неточному количеству.
Это так? Или внутри нетти какая -то синхронизация, которая приведет к промыванию записи в поле счетов?
Решение
Если у вас нет исполнителя в вашем трубопроводе, и вы выполняете ваши обработчики исключительно в потоках работников ввода -вывода, то вы в порядке, так как Netty гарантирует, что данный экземпляр трубопровода всегда вызывает из одного и того же рабочего потока.
Если вы добавляете обработчик выполнения в свой трубопровод, то вы в порядке, если вы используете Netty OrderedMemoryAwarethreadPoolexeCutor.
Если вы обращаетесь к своему трубопроводу из не-сетевого потока, или у вас есть неординированная суммарноризация
Я рекомендую просмотреть следующие потоки в архивах форума пользователей Netty.
Другие советы
Когда вы создаете Netty ChannelPipeline
Если вы добавите такой же экземпляр вашего Handler
Для всех каналов, тогда да, несколько потоков будут читать/изменять ваши данные.
Если вы создаете новый экземпляр Handler
за канал в вашем трубопроводе, как показано ниже, тогда вы в безопасности, только одна нить получить доступ к обработчику в трубопровод тогда.
ChannelPipeline p = Channels.pipeline();
pipeline.addLast("handler", new Handler());
Также посмотрите на Нетти Channellocal, это как Java ThreadLocal
и вы можете установить состояние на графике на канале