public void QueueMessage(OutboundMessage msg) { lock (_messageQueue) { _messageQueue.Enqueue(msg); } }
private List <InFlightMessage> ChooseMsg() { lock (_inFlight) { _inFlight.RemoveAll(m => IdIsLessThanEqualOther(m.Message.PacketId, _lastReceivedAck)); // If any were resent, then dont send anything new if (_inFlight.Count > 0) { DateTime now = DateTime.Now; if (_inFlight.Any(m => GetTimeBetween(m.LastSent, now) > InFlightTimeout)) { List <InFlightMessage> toResend = _inFlight.ToList(); Log.WarnFormat("{0} - Resending {1} packets from #{2}", Endpoint, toResend.Count, toResend[0].Message.PacketId); return(toResend); } } if (_inFlight.Count >= MaxInFlight) { return(null); } lock (_messageQueue) { if (_messageQueue.Any()) { // create new message, send it and track it var msg = new InFlightMessage(_messageQueue.Dequeue().WithPacketId(NextPacketId), 0); // TODO - should this be able to perform an ack? _inFlight.Add(msg); return(new List <InFlightMessage> { msg }); } } OutboundMessage obMsg = CompileNextMessage(); if (obMsg == null) { return(null); } uint ackId = 0; lock (_lastSentAckLock) { bool shouldSend = _readyToAck > _lastSentAck; if (shouldSend) { ackId = _readyToAck; } } var newMsg = new InFlightMessage(obMsg.WithPacketId(NextPacketId), ackId); _inFlight.Add(newMsg); return(new List <InFlightMessage> { newMsg }); } }
public InFlightMessage(OutboundMessage message, uint?ackId) { Message = message; AckId = ackId; LastSent = DateTime.MinValue; }