public IPersistentConnection GetPeekConnection() { RequeueTimedOutCommits(); while (true) { IPersistentConnection connection; if (!PeekConnections.TryPeek(out connection)) { Thread.Sleep(1); return(null); } if (!connection.ConnectionState.HasFlag(ConnectionState.Subscribed) || connection.SubscriptionType != SubscriptionType.PeekAndCommit) { PeekConnections.TryDequeue(out connection); continue; } if (connection.NextPeekTime < _dateTimeProvider.UtcNow) // device can be checked for new outgoing messages { if (!PeekConnections.TryDequeue(out connection)) { continue; } return(connection); } Thread.Sleep(1); return(null); // we are too early } }
public void RequeueAsPeekConnections(IEnumerable <IPersistentConnection> connections) { foreach (var connection in connections) { connection.NextPeekTime = PeekTime; PeekConnections.Enqueue(connection); } }
public void CommitSuccess(string deviceId) { IPersistentConnection connection; if (CommitConnections.TryRemove(deviceId, out connection)) { connection.NextPeekTime = PeekTime; PeekConnections.Enqueue(connection); } }
public void AddConnection(IPersistentConnection connection) { if (connection.SubscriptionType == SubscriptionType.ReceiveAndForget) { connection.NextReceiveAndForgetTime = ReceiveAndForgetTime; ReceiveAndForgetConnections.Enqueue(connection); return; } if (connection.SubscriptionType == SubscriptionType.PeekAndCommit) { connection.NextPeekTime = PeekTime; PeekConnections.Enqueue(connection); return; } throw new NotImplementedException(); }