Политика отбрасывания ограниченной очереди клиента Netty

Ошибка OutMemoryError при подключении к стороннему серверу, который не может достаточно быстро обрабатывать запросы.

Попытался передать NioClientSocketChannelFactory в службу-исполнитель с ограниченной очередью и политикой отбрасывания (ThreadPoolExecutor.DiscardPolicy), но все равно получил OutOfMemoryError.

Что мне не хватает?

Спасибо


person user432024    schedule 07.12.2011    source источник


Ответы (1)


Если буфер записи вашего канала Netty на стороне клиента заполняется, а сервер читает его недостаточно быстро, вы увидите OutOfMemoryError на стороне клиента. Чтобы избежать этого, вы должны перестать писать, если Channel.isWritable() возвращает false. Вы будете уведомлены событием channelInterestOpsChanged, когда состояние Channel.writable' changes. Then, you can check again ifChannel.isWritable()returnstrue` и продолжите запись.

Если можно отбросить ожидающие данные, я бы просто не вызывал Channel.write(), если Channel.isWritable() возвращает false.

Вы можете настроить при изменении свойства Channel.writable свойства водяного знака, предоставленные в NioSocketChannelConfig. Кроме того, пожалуйста, взгляните на пример «отброса», в котором используется этот метод.

person trustin    schedule 07.12.2011
comment
Кажется, сработало. Кстати, стоит ли мне использовать ограниченный рабочий пул или просто использовать кешированный, который используется в примерах? Спасибо - person user432024; 08.12.2011
comment
Рабочий пул должен быть кэшированным. - person trustin; 08.12.2011
comment
Любая конкретная причина, по которой это необходимо? А если должен, то зачем оставлять возможность его изменить? Просто любопытно, хе-хе - person user432024; 08.12.2011
comment
Разве не было бы разумно, если бы Нетти автоматически отступила? Нет никакого риска в ожидании по времени здесь, так как мы уже оказываем достаточное давление на систему. - person Viktor Klang; 30.12.2011