示例#1
0
 public void InjectMessage(ReceivedTransportMessage message, bool forceMessage = false)
 {
     var sequence = _ringBuffer.Next();
     var entry = _ringBuffer[sequence];
     entry.InitialTransportMessage = message;
     entry.ForceMessageThrough = forceMessage;
     entry.QueuedInboundEntries = null;
     entry.IsInfrastructureMessage = false;
     entry.IsStrandardMessage = false;
     entry.IsCommand = false;
     entry.Command = null;
     _ringBuffer.Publish(sequence);
 }
        public bool IsSequenceNumberValid(ReceivedTransportMessage data, bool syncProcessorInitialized)
        {
            var transportMessageSequenceNumber = data.SequenceNumber;
            if (!transportMessageSequenceNumber.HasValue)
                return true;
            var peerKey = new PeerTransportKey(data.PeerId, data.Endpoint);
            int currentSeqNum;
            if (!_sequenceNumber.TryGetValue(peerKey, out currentSeqNum))
            {
                _sequenceNumber.Add(peerKey, -1);
                currentSeqNum = -1;
            }
            if (syncProcessorInitialized)
            {
                if (_peerConfiguration.PeerId != peerKey.Peer)
                {
                    if (transportMessageSequenceNumber != (currentSeqNum + 1))
                    {
                        _logger.Info(string.Format("missed message from endpoint {3} from peer {0} from sequence number {1} to {2}",
                                          peerKey.Peer,
                                          currentSeqNum + 1,
                                          transportMessageSequenceNumber,
                                          peerKey.Endpoint));
            #if DEBUG
                        Debugger.Break();
                        //we missed a message
            #endif
                        return false;
                    }

                    _sequenceNumber[peerKey] = transportMessageSequenceNumber.Value;
                }
            }
            else
            {
                _sequenceNumber[peerKey] = transportMessageSequenceNumber.Value;
            }
            return true;
        }
 public ProcessMessageCommand(ReceivedTransportMessage messagesToProcess)
 {
     MessagesToProcess = messagesToProcess;
 }