Exemplo n.º 1
0
        private async Task <int> Dequeue(IEnumerable <byte> buffer, int maxNumberOfMessageToDequeue)
        {
            KVAnswer        answer;
            KVParsingStatus answerStatus;
            int             dequeuedMessageCount = 0;
            int             dequeuedBytesCount   = 0;

            while (true)
            {
                try
                {
                    // we build as many answers as we can
                    answerStatus = KVAnswer.TryParse(buffer, ByteBuffer.Count, out answer);
                    if (answerStatus == KVParsingStatus.Valid)
                    {
                        dequeuedMessageCount += 1;
                        dequeuedBytesCount   += answer.MessageLength;
                        ByteBuffer.Dequeue(answer.MessageLength);

                        // throw the answer
                        await OnKVAnswerReceived(answer);

                        // test for max message to dequeue
                        if (maxNumberOfMessageToDequeue > 0 && dequeuedMessageCount >= maxNumberOfMessageToDequeue)
                        {
                            Debug.WriteLine("The maximum number of messages to dequeue has been reached");
                            break;
                        }
                    }
                    else
                    {
                        if (answerStatus == KVParsingStatus.Empty)
                        {
                            // the stream is corrupted : dequeue all zeros
                            ByteBuffer.Clean();
                        }
                        break;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Write(ex.Message);
                    throw;
                }
            }

            return(dequeuedBytesCount);
        }
Exemplo n.º 2
0
        private Task OnKVAnswerReceived(KVAnswer answer)
        {
            KVReply reply;

            if (ReplyQueue.TryRemove(answer.Id, out reply))
            {
                reply.SetAnswer(answer, chrono);
                Logger.Log(LogLevel.Debug, "<< query dequeue : id={0}, len={1}, mode={2}, tm={3}", answer.Id, answer.MessageLength, answer.Mode, reply.RoundTripTime.TotalMilliseconds);

                if (reply.Callback != null)
                {
                    return(reply.Callback.Invoke(reply));
                }
            }
            else
            {
                Logger.Log(LogLevel.Warn, "the answer was not paired with a query");
            }

            return(Task.CompletedTask);
        }
Exemplo n.º 3
0
 internal void SetAnswer(KVAnswer answer, Stopwatch chrono)
 {
     RoundTripTime = TimeSpan.FromMilliseconds((double)(chrono.ElapsedMilliseconds - msElapsed_start));
     Answer        = answer;
 }