public void OnNext(RingbufferByteArray data, long sequence, bool endOfBatch)
        {
            data.StartProcessTime = dateService.UtcNow();

            data.GetContent(ref queueBuffer);
            deserializedMessage = serializer.Deserialize <ClientToServerMessage>(queueBuffer, data.ContentLength);

            if (deserializedMessage == null)
            {
                return;
            }

            switch (deserializedMessage.MessageType)
            {
            case ClientToServerMessageTypeEnum.ModifyStopLimitOrder:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var stopLimitOrderToModify = ordeRepository.TryGetStopLimitOrder(deserializedMessage.StopLimitOrder.ExchangeOrderId);
                if (stopLimitOrderToModify == null)
                {
                    return;
                }

                stopLimitOrderToModify.Modify(deserializedMessage.StopLimitOrder.TriggerPrice, deserializedMessage.StopLimitOrder.LimitPrice, deserializedMessage.StopLimitOrder.Quantity);
                outgoingQueue.EnqueueUpdatedStopLimitOrder(stopLimitOrderToModify);

                break;

            case ClientToServerMessageTypeEnum.RequestOpenStopLimitOrders:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var orders = ordeRepository.GetClientStopLimitOrders(deserializedMessage.ClientId);
                if (orders.Count == 0)
                {
                    return;
                }

                outgoingQueue.EnqueueStopLimitOrderSnapshot(deserializedMessage.ClientId, orders);
                break;

            case ClientToServerMessageTypeEnum.CancelStopLimitOrder:
                var stopOrderToCancel = ordeRepository.TryGetStopLimitOrder(deserializedMessage.StopLimitOrder.ExchangeOrderId);

                if (stopOrderToCancel != null)
                {
                    stopOrderToCancel.Delete();
                    outgoingQueue.EnqueueDeletedStopLimitOrder(stopOrderToCancel);
                }
                break;

            case ClientToServerMessageTypeEnum.PlaceStopLimitOrder:
                if (!deserializedMessage.StopLimitOrder.ValidateForAdd())
                {
                    return;
                }

                var newStopLimitOrder = ordeRepository.NewStopLimitOrder(deserializedMessage.StopLimitOrder);
                dispatcher.HandleAddStopLimitOrder(newStopLimitOrder);
                break;


            case ClientToServerMessageTypeEnum.PlaceMarketOrder:
                if (!deserializedMessage.MarketOrder.ValidateForExecute())
                {
                    return;
                }

                var newMarketOrder = ordeRepository.NewMarketOrder(deserializedMessage.MarketOrder);
                dispatcher.HandleMarketOrder(newMarketOrder);
                break;

            case ClientToServerMessageTypeEnum.PlaceLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidatesForAdd())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Limit order was rejected.");
                    break;
                }

                var newLimitOrder = ordeRepository.NewLimitOrder(deserializedMessage.LimitOrder);
                newLimitOrder.RegisterDeleteNotificationHandler(outgoingQueue.EnqueueDeletedLimitOrder);
                newLimitOrder.RegisterModifyNotificationHandler(outgoingQueue.EnqueueUpdatedLimitOrder);
                newLimitOrder.RegisterFilledNotification(outgoingQueue.EnqueueDeletedLimitOrder);
                newLimitOrder.RegisterFilledNotification((order) => order.Delete());

                dispatcher.HandleAddLimitOrder(newLimitOrder);
                break;

            case ClientToServerMessageTypeEnum.CancelLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidateForDelete())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Cancellation of limit order was rejected.");
                    break;
                }

                var orderToDelete = ordeRepository.TryGetLimitOrder(deserializedMessage.LimitOrder.ExchangeOrderId);
                if (orderToDelete != null)
                {
                    orderToDelete.Delete();
                    outgoingQueue.EnqueueDeletedLimitOrder(orderToDelete);
                }
                break;

            case ClientToServerMessageTypeEnum.ModifyLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidatesForModify())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Modification of limit order was rejected.");
                    break;
                }

                var orderToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.LimitOrder.ExchangeOrderId);
                if (orderToModify != null)
                {
                    orderToModify.Modify(deserializedMessage.LimitOrder.Quantity, deserializedMessage.LimitOrder.Price);
                }
                break;

            case ClientToServerMessageTypeEnum.RequestOpenLimitOrders:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var orderList = ordeRepository.GetClientStopLimitOrders(deserializedMessage.ClientId);
                outgoingQueue.EnqueueStopLimitOrderSnapshot(deserializedMessage.ClientId, orderList);
                break;


            case ClientToServerMessageTypeEnum.DuoLimitOrderUpdate:
                var order1ToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.DuoLimitOrder.LimitOrder1.ExchangeOrderId);
                var order2ToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.DuoLimitOrder.LimitOrder2.ExchangeOrderId);

                if (order1ToModify == null || order2ToModify == null)
                {
                    return;
                }

                if (order1ToModify.Symbol != order2ToModify.Symbol)
                {
                    return;
                }

                dispatcher.HandDuoLimitOrderUpdate(
                    order1ToModify,
                    deserializedMessage.DuoLimitOrder.LimitOrder1.Price,
                    deserializedMessage.DuoLimitOrder.LimitOrder1.Quantity,
                    order2ToModify,
                    deserializedMessage.DuoLimitOrder.LimitOrder2.Price,
                    deserializedMessage.DuoLimitOrder.LimitOrder2.Quantity);

                break;
            }

            deserializedMessage.Reset();
        }