Нейти одновременно изменяет пропущенные каналы
Вопрос
В Netty кто -нибудь знает, перешел ли канал Buffer к обработчику для события вверх по течению (после того, как вы разыграете его из ChannelEvent / или MessageEvent), будет одновременно записан в рамках Netty Framework во время его обработки?
Руководство пользователя и примеры явно не разъясняют, произойдет ли это или нет.
Например, представьте себе метод ниже в классе, который расширяет SimpleChannelHandler и связан как обработчик на сервере Netty:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
if (buffer.readableBytes() == 4)
{
// Is it possible for the number of readable bytes to increase here?
}
}
В приведенном выше методе можно ли увеличить количество читаемых байтов в комментированной строке (при условии, что клиент все еще отправляет данные), или эти кадры гарантируют, что будут отдельные сообщения и не записанные в поставляемый буфер?
Причина, по которой я спрашиваю, состоит в том, чтобы узнать, должен ли я скопировать буфер на локальный, прежде чем выполнять некоторые из моей обработки, или такая копия является излишней.
Решение
Как только нетти создает ChannelBuffer
и триггеры а MessageEvent
С ним он не выходит из рук Нейти, и, таким образом, Нетти не изменяет его ни в коем случае. Обработчики или другой код пользователя могут изменить буфер, но обычно хорошо написанные обработчики не мешают другим обработчикам. Если плохой обработчик сохраняет ссылку на полученный буфер и изменяется позже, то вы увидите сломанное буферное состояние.