public virtual void ProcessMessageWithHighSeqNum()

in FixAntenna/NetCore/FixEngine/Session/MessageHandler/Global/OutOfSequenceMessageHandler.cs [197:277]


		public virtual void ProcessMessageWithHighSeqNum(FixMessage message, long incomingSeqNum, long expectedSeqNum)
		{
			if (Log.IsInfoEnabled)
			{
				Log.Info("Incoming seq number: " + incomingSeqNum + " is greater than expected " + expectedSeqNum);
			}
			var isPosDupResendReq = false;
			var sessionSequenceManager = GetSequenceManager();
			if (sessionSequenceManager.SeqResendManager.IsRrRangeActive)
			{
				if (_advancedResendRequestProcessing)
				{
					// The last MsgSeqNum value received and processed
					var tagIndex = message.GetTagIndex(369);
					var outSeqNum = Session.RuntimeState.OutSeqNum;
					if (tagIndex != FixMessage.NotFound && message.GetTagValueAsLongAtIndex(tagIndex) != outSeqNum - 1)
					{
						isPosDupResendReq = true;
					}
				}
			}

			var lastRrSeqNum = sessionSequenceManager.GetRrSequenceFromSession();
			var waitingForRrAnswer = lastRrSeqNum != -1;

			if (lastRrSeqNum < incomingSeqNum)
			{
				Session.FixSessionOutOfSyncListener.OnGapDetected(expectedSeqNum, incomingSeqNum);
			}

			var isLogon = FixMessageUtil.IsLogon(message);
			if (_allowToSendMultipleRr || !waitingForRrAnswer)
			{
				var countOfSentRequests = sessionSequenceManager.GetCountOfSentRequests(expectedSeqNum, incomingSeqNum);
				if (countOfSentRequests < _allowedCountOfSimilarRr)
				{
					//sessionSequenceManager.getSeqResendManager().putMessageIntoBuffer(message.clone());
					if (IncludeNextExpectedMsgSeqNum && isLogon)
					{
						Log.Info("Enabled handleSeqNumAtLogon option - don't send ResendRequest for Logon but set 789 tag");
					}
					else
					{
						sessionSequenceManager.RequestLostMessages(expectedSeqNum, incomingSeqNum, isPosDupResendReq);
					}
				}
				else
				{
					var errorMessage = "Detected possible infinite resend loop for range from " + incomingSeqNum + " to " + expectedSeqNum + " (" + _allowedCountOfSimilarRr + " times)";
					Session.ForcedDisconnect(DisconnectReason.PossibleRrLoop, errorMessage, false);
					throw new RrLoopException(errorMessage, message.ToPrintableString());
				}
			}
			else
			{
				if (!isLogon)
				{
					var endOfRr = sessionSequenceManager.GetEndRangeOfRrSequence();
					if (incomingSeqNum < endOfRr)
					{
						sessionSequenceManager.RequestLostMessages(expectedSeqNum, incomingSeqNum, isPosDupResendReq);
					}
					else
					{
						var resendManager = sessionSequenceManager.SeqResendManager;
						if (!resendManager.IsMessageProcessingFromBufferStarted)
						{
							resendManager.PutMessageIntoBuffer((FixMessage)message.Clone());
						}

					}
				}
			}

			if (isLogon)
			{
				CallNextHandler(message);
			}
			// reduce seq number because current message was ignored
			sessionSequenceManager.DecrementIncomingSeqNumber();
		}