Получить оставшиеся события / сообщения из конвейера, если канал был закрыт - PullRequest
1 голос
/ 23 марта 2012

В данный момент я работаю над проектом по отслеживанию gps-устройств.Поскольку они связываются по TCP с помощью специального (двоичные данные, содержащие, например, html) протокола, netty был первым выбором.Но теперь мы сталкиваемся с некоторыми серьезными проблемами.

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

В настоящее время ведение журнала в основном работает следующим образом: channel.getPipeline (). SendUpstream (new LogEvent (channel, record))

Чтобы упростить и получить все возможности современных API-интерфейсов ведения журнала, мы обернули это в специальный класс ChannelLogger, который мы можем использовать следующим образом:

ChannelLogger.fine(channel, "...");
ChannelLogger.info(channel, "...");
ChannelLogger.warn(channel, "...", [Throwable]);

Мой вопрос заключается в том, как получить LogEvents, оставшиесятрубопровод, если канал был закрыт?

// handler 1
ChannelLogger.warn(channel, ...);
...
// handler 2
channel.close();

Закрытие выполняется немедленно, поэтому все оставшиеся данные в конвейере отбрасываются, таким образом, наши события журнала (в основном ошибки, описывающие, почему канал был закрыт) тоже.

Заранее спасибоЭрик

1 Ответ

2 голосов
/ 23 марта 2012

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

Теперь к вашему вопросу ... Это должно сработать:

channel.write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
...