В Netty мы можем позвонить ChannelConfig.setAutoRead()
, чтобы запустить или остановить автоматическое чтение в Channel
. Например, GlobalChannelTrafficShapingHandler
будет вызывать setAutoRead(false)
для периодической приостановки чтения, чтобы скорость чтения оставалась ниже заданной полосы пропускания.
Наше приложение Netty представляет собой прокси, который открывает два Channel
s для каждого запроса (один для клиента и один для сервера ). Мы используем GlobalChannelTrafficShapingHandler
для регулирования скорости чтения Channel
сервера. Кроме того, мы создали CustomThrottlingHandler
, который также ограничивает скорость чтения Channel
сервера, используя нашу собственную политику.
Мы столкнулись с проблемами, когда оба ChannelHandler
s настраивали сервер ChannelConfig
s autoRead
в соответствии с их собственной политикой. У GlobalChannelTrafficShapingHandler
есть некоторый лог c, который пытается определить, когда другой абонент установил autoRead
, но он не работает так, как нам нужно. Мы обошли проблему, установив пользовательский Attribute
на сервере Channel
, но это не элегантно.
В общем, когда несколько ChannelHandler
s регулируют один и тот же Channel
, я бы хотел использовать самую строгую политику регулирования среди всех регуляторов следующим образом:
- Когда
ChannelConfig.setAutoRead(false)
вызывается любым ChannelHandler
, установите AutoRead
в false
в базовом канале. - Когда
ChannelConfig.setAutoRead(true)
вызывается любым ChannelHandler
, не следует сразу устанавливать базовую настройку AutoRead
на true
. Вместо этого каким-то образом запишите намерение из ChannelHandler
(или, в более общем случае, вызывающего абонента), чтобы установить AutoRead
в true
. Когда все абоненты выразят свое намерение setAutoRead(true)
, только тогда мы сделаем вызов setAutoRead(true)
на базовом Channel
.
Я был бы признателен за некоторые идеи о том, как этого добиться. Спасибо!