2017-02-02 9 views
0

Имеются ли экземпляры обработчиков каналов Netty, таких как (SimpleChannelInboundHandler, ChannelInboundHandlerAdapter и т. Д.), Совместно используют один и тот же поток и стек или каждый из них имеет собственный поток и стек? Я спрашиваю, потому что я создаю несколько обработчиков каналов, и мне нужно, чтобы они обменивались данными друг с другом, и я должен решить между использованием обмена потоками или не-потоковой связью.Обработчики, потоки и стеки Netty-каналов

Спасибо за ваш ответ

ответ

1

Ответ: это зависит

Я предполагаю, что вы должны строить сервер, часть того, что я говорю, не может применяться.

Согласно https://netty.io/4.0/api/io/netty/channel/ChannelHandler.html, один из факторов, определяющих, на какой поток работает ваш обработчик канала, - это то, как вы добавляете его в конвейер. Netty позволяет использовать один экземпляр вашего обработчика для всех конвейеров (т. Е. Подключения к вашему серверу), и в этом случае вы должны учитывать разные потоки.

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

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

Лучше всего для отладки текущего потока в каждом обработчике перед принятием решения, поведения потоковой Нетти и как он взаимодействует с вашей программой является весьма субъективными от реализации и где вы перемещаете ваши данные.

1

Как правило, если ваш обработчик имеет состояние, то это один обработчик на канал (конвейер). В противном случае аннотируйте обработчик с помощью @ ChannelHandler.Sharable и используйте один и тот же экземпляр для каждого канала.