Гибкий механизм тайм-аута в JBoss Netty?

Я рассматриваю возможность переноса своей реализации Java NIO на JBoss Netty, так как она обеспечивает гораздо более чистую модель, чем я реализовал. . Реализация управляет рядом клиентских подключений к компонентам по протоколу TCP с использованием собственного протокола.

Один аспект моей реализации, который я не вижу в Netty, — это возможность устанавливать произвольные тайм-ауты, которые:

  1. Подождите, пока некоторые данные будут прочитаны из компонента. Я знаю, что у Netty есть ReadTimeoutHandler, но может ли значение тайм-аута быть легко изменено/отключено компонентом, когда он проходит через конечный автомат?
  2. Подождите, пока истечет время, чтобы я мог повторно подключиться к Компоненту (чтобы дать Компоненту время для перезапуска после отключения). Это совершенно не связано с коммуникацией и представляет собой простой тайм-аут, однако я бы хотел, чтобы «событие/исключение» тайм-аута было представлено классу обработчика так же, как и другие тайм-ауты, связанные с коммуникацией.

Можно ли реализовать этот механизм тайм-аута с помощью Netty?

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


person trojanfoe    schedule 25.02.2011    source источник
comment
Какой канал вы реализуете, серверный или клиентский?   -  person secmask    schedule 25.02.2011
comment
Ты имеешь в виду дескриптор, а не обработчик...   -  person someguy    schedule 25.02.2011
comment
@someguy: Нет, я использую термин Handler для класса, который «представляет» компонент, с которым я общаюсь. @secmask: это клиентские подключения к нескольким компонентам.   -  person trojanfoe    schedule 26.02.2011
comment
Да, его обычно называют ручкой. Обработчик, с другой стороны, «это асинхронная подпрограмма обратного вызова, которая обрабатывает входные данные, полученные в программе» (википедия).   -  person someguy    schedule 26.02.2011
comment
@someguy: Ну, дескриптор - это идентификатор ресурса, и это не так. Я использую его в общем смысле, так что не беспокойтесь об этом.   -  person trojanfoe    schedule 27.02.2011


Ответы (1)


См. ChannelConfig. Метод setConnectTimeoutMillis(int ) устанавливает время ожидания в миллисекундах. Вы можете вызвать этот метод через Bootstrap экземпляр, вызвав setOption(String, Object). name будет "connectTimeoutMillis", а value будет желаемым временем ожидания в миллисекундах.

В следующем фрагменте кода показано, как установить время ожидания подключения на 5000 миллисекунд (5 секунд).

ClientBootstrap bootstrap... // bootstrap instance
bootstrap.setOption("connectTimeoutMillis", 5000);
person someguy    schedule 25.02.2011
comment
Большое спасибо - однако (и я думаю, что я не ясно выразился здесь) - я использую значение тайм-аута, чтобы ограничить повторное подключение. Сценарий заключается в том, что соединение обрывается, и я хочу дать компоненту возможность перезапуститься перед подключением. Удовлетворит ли описанный вами метод этому условию? - person trojanfoe; 26.02.2011
comment
@trojanfoe Насколько мне известно, в этом случае вам придется реализовать что-то подобное самостоятельно. Что касается первой части вашего нового вопроса, я думаю, вам придется использовать другой ReadTimeoutHandler. Я думаю, у вас будет другой экземпляр для каждого состояния. - person someguy; 26.02.2011
comment
Хорошо, это имеет смысл, спасибо. Да, значение тайм-аута меняется для каждого состояния. - person trojanfoe; 27.02.2011