Можно ли писать на канал Netty, не создавая ненужного ChannelFuture? (Без создания ненужного объекта для GC...)
Запись на канал Netty без ChannelFuture
Ответы (2)
Если вы действительно не хотите создавать ChannelFuture
, вы можете сделать это для Netty 3:
Channels.write(ctx, Channels.succeededFuture(channel), message);
Channels.succeededFuture(..)
возвращает одноэлементный объект локального канала. Однако вы никогда не должны добавлять слушателя к возвращаемому будущему, потому что оно уже завершено.
В Netty 4 вы можете использовать void promise:
ctx.write(msg, ctx.voidPromise());
ChannelHandlerContext.voidPromise()
возвращает фиктивное одноэлементное обещание, которое никогда не выполняется. Такие операции, как добавление прослушивателя или ожидание его выполнения, немедленно завершатся ошибкой.
Нет... ChannelFuture будет создаваться все время. Но ChannelFuture дешев и мал, поэтому я думаю, что есть лучшие места для поиска оптимизации.
Я думаю, что более важно вызывать Channel.write(..) как можно реже, поскольку запись может быть дорогостоящей с точки зрения системных вызовов. Поэтому, если вам нужно отправить несколько буферов, вы можете поместить их все в один и просто вызвать Channel.write(...) один раз, а не, например, 5 раз.
В SMTP это можно сделать, например, если SMTP-сервер поддерживает расширение PIPELINING и, таким образом, оптимально использует ресурсы.