Запись на канал Netty без ChannelFuture

Можно ли писать на канал Netty, не создавая ненужного ChannelFuture? (Без создания ненужного объекта для GC...)


person Eirenliel    schedule 22.01.2012    source источник


Ответы (2)


Если вы действительно не хотите создавать ChannelFuture, вы можете сделать это для Netty 3:

Channels.write(ctx, Channels.succeededFuture(channel), message);

Channels.succeededFuture(..) возвращает одноэлементный объект локального канала. Однако вы никогда не должны добавлять слушателя к возвращаемому будущему, потому что оно уже завершено.

В Netty 4 вы можете использовать void promise:

ctx.write(msg, ctx.voidPromise());

ChannelHandlerContext.voidPromise() возвращает фиктивное одноэлементное обещание, которое никогда не выполняется. Такие операции, как добавление прослушивателя или ожидание его выполнения, немедленно завершатся ошибкой.

person trustin    schedule 27.01.2012
comment
В чем проблема добавления обработчика к successedFuture (код, который это делает, может не знать, что future уже выполнено)? По моему опыту, слушатель сразу же вызывается после добавления, чего, я думаю, хочет большинство людей. Или это потому, что это синглтон, который может со временем накапливать слушателей? Есть ли разница в этом отношении между Channels.succeededFuture(..) и new SucceededChannelFuture(...)? - person user462982; 31.03.2012
comment
@trustin - Можете ли вы показать синтаксис Netty 5, встроенный в этот вопрос? - person jeevatkm; 07.02.2015

Нет... ChannelFuture будет создаваться все время. Но ChannelFuture дешев и мал, поэтому я думаю, что есть лучшие места для поиска оптимизации.

Я думаю, что более важно вызывать Channel.write(..) как можно реже, поскольку запись может быть дорогостоящей с точки зрения системных вызовов. Поэтому, если вам нужно отправить несколько буферов, вы можете поместить их все в один и просто вызвать Channel.write(...) один раз, а не, например, 5 раз.

В SMTP это можно сделать, например, если SMTP-сервер поддерживает расширение PIPELINING и, таким образом, оптимально использует ресурсы.

person Norman Maurer    schedule 22.01.2012