#netty
Вопрос:
У меня есть некоторый поток, отправляющий объект сообщения о событии пользователя (который содержит ByteBuf) в канал, а затем это сообщение будет обработано в методе обработчика userEventTriggered (), который выполняет некоторую логику и, наконец, записывает в канал, так что ByteBuf, содержащийся в объекте сообщения о событии, затем автоматически освобождается netty. Но я обнаружил, что если канал закрыт, функция userEventTriggered() больше не будет вызываться, поэтому ByteBuf просачивается во внутреннюю очередь сообщений о событиях пользователя.
В настоящее время я использую concurrentlink-запрос для хранения ожидающего объекта сообщения о событии пользователя. Если я хочу отправить сообщение на канал, я помещаю сообщение в очередь и уведомляю канал другим объектом сообщения. Если канал активен, он будет извлекать сообщение из очереди, в противном случае сообщение сохраняется в очереди, в конце концов, сообщения, оставшиеся в очереди, будут очищены в каком-либо процессе.
Это решение, похоже, работает, но могут быть и более простые и изящные решения. Любая помощь будет очень признательна!
Ответ №1:
Из того, что я понял, это правильный способ справиться с этим. Вы также можете захотеть просто не помещать сообщения в очередь для закрытых каналов, так как netty сама опубликует пользовательские события, если они достигнут конца конвейера.
Комментарии:
1. Но в некоторых редких случаях канал может быть закрыт сразу после того, как функция channel.isActive() вернет значение true.