Как очистить ресурс, содержащий пользовательское событие, после закрытия канала

#netty

Вопрос:

У меня есть некоторый поток, отправляющий объект сообщения о событии пользователя (который содержит ByteBuf) в канал, а затем это сообщение будет обработано в методе обработчика userEventTriggered (), который выполняет некоторую логику и, наконец, записывает в канал, так что ByteBuf, содержащийся в объекте сообщения о событии, затем автоматически освобождается netty. Но я обнаружил, что если канал закрыт, функция userEventTriggered() больше не будет вызываться, поэтому ByteBuf просачивается во внутреннюю очередь сообщений о событиях пользователя.

В настоящее время я использую concurrentlink-запрос для хранения ожидающего объекта сообщения о событии пользователя. Если я хочу отправить сообщение на канал, я помещаю сообщение в очередь и уведомляю канал другим объектом сообщения. Если канал активен, он будет извлекать сообщение из очереди, в противном случае сообщение сохраняется в очереди, в конце концов, сообщения, оставшиеся в очереди, будут очищены в каком-либо процессе.

Это решение, похоже, работает, но могут быть и более простые и изящные решения. Любая помощь будет очень признательна!

Ответ №1:

Из того, что я понял, это правильный способ справиться с этим. Вы также можете захотеть просто не помещать сообщения в очередь для закрытых каналов, так как netty сама опубликует пользовательские события, если они достигнут конца конвейера.

Комментарии:

1. Но в некоторых редких случаях канал может быть закрыт сразу после того, как функция channel.isActive() вернет значение true.