public virtual void OnData(ByteBuffer buffer) { while (buffer.HasRemaining()) { var complete = message.ReadFrom(buffer); if (!complete) { return; } //MESSAGE IS COMPLETE HERE if (message.IsFlagSet(ClientMessage.BeginAndEndFlags)) { //HANDLE-MESSAGE HandleMessage(message); message = ClientMessage.Create(); continue; } if (message.IsFlagSet(ClientMessage.BeginFlag)) { // first fragment var builder = new BufferBuilder(); builderBySessionIdMap.Add(message.GetCorrelationId(), builder); builder.Append(message.Buffer(), 0, message.GetFrameLength()); } else { var builder = builderBySessionIdMap[message.GetCorrelationId()]; if (builder.Position() == 0) { throw new InvalidOperationException(); } builder.Append(message.Buffer(), message.GetDataOffset(), message.GetFrameLength() - message.GetDataOffset()); if (message.IsFlagSet(ClientMessage.EndFlag)) { var msgLength = builder.Position(); var cm = ClientMessage.CreateForDecode(builder.Buffer(), 0); cm.SetFrameLength(msgLength); //HANDLE-MESSAGE HandleMessage(cm); builderBySessionIdMap.Remove(message.GetCorrelationId()); } } message = ClientMessage.Create(); } }