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();
}