IdleStateHandler - добавление и удаление одного и того же экземпляра в том же конвейере - PullRequest
3 голосов
/ 28 июня 2019

Мне нужно иметь возможность добавлять и удалять IdleStateHandler в конвейере в зависимости от определенных условий.Я создаю один экземпляр IdleStateHandler для каждого канала и сохраняю ссылку на этот экземпляр в классе соединения.

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

Я понимаю, что не могу использовать один и тот же обработчик на нескольких каналах.Однако в моем случае экземпляр обработчика уникален для каждого канала.Почему для этого требуется, чтобы обработчик был разделяемым?Есть ли обходные пути для этого?Я знаю, что могу каждый раз создавать новый экземпляр, но мы пытаемся сократить количество создаваемых нами новых объектов.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Как заявил Норман, текущий дизайн не предназначен для повторного использования IdleStateHandler. Вы должны создать новый IdleStateHandler и заменить старый новым.

Прямо сейчас, когда обработчик добавлен в конвейер - конвейер помечает специальное поле состояния boolean added в ChannelHandlerAdapter как true. Однако, когда обработчик удален, этот флаг никогда не возвращается обратно. Поэтому, когда вы снова попытаетесь добавить этот обработчик, вы получите исключение (поскольку added по-прежнему true).

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

0 голосов
/ 29 июня 2019

Большинство обработчиков имеют какой-то жизненный цикл, что затрудняет поддержку удаления и повторного добавления. Тем не менее, я думаю, что это можно сделать ... На сегодняшний день нет способа заставить его работать с IdleStateHandler, поэтому вам нужно снова создать обработчик. Тем не менее, мне интересно, почему вы не можете просто иметь другой обработчик в конвейере, который будет либо перенаправлять IdleStateEvent, либо просто подавлять его. Это будет похоже на удаление обработчика, если вы не хотите получать эти события.

...