private void AssignDeliveryMessages() { OperationContext context = new OperationContext(); int runCount = 0; while (true) { if (runCount++ > 200) { _hadPendingWork = true; break; //to prevent starvation and let other operations happen } var message = _store.GetNextUndeliveredMessage(TimeSpan.MaxValue, context); if (message != null) { SubscriptionInfo subscription = null; subscription = _store.GetSubscriber(message.Topic, SubscriptionType.Publisher, context); if (subscription == null) { IList <MessageInfo> messages = new List <MessageInfo>() { message }; _store.RemoveMessages(messages, MessageRemovedReason.Removed, context); continue; } _store.AssignmentOperation(message, subscription, TopicOperationType.AssignSubscription, new OperationContext()); } else { break; } } }
private void RevokeExpiredAssignments() { OperationContext context = new OperationContext(); if (DateTime.Now < _expirationTimestamp.AddSeconds(10)) { return; } IList <MessageInfo> unacknowledgedMessages = _store.GetUnacknowledgeMessages(new TimeSpan(0, 0, 20)); int runCount = 0; foreach (MessageInfo message in unacknowledgedMessages) { _store.AssignmentOperation(message, null, TopicOperationType.RevokeAssignment, new OperationContext()); if (runCount++ > 200) { _hadPendingWork = true; break; //to prevent starvation and let other operations happen } } _expirationTimestamp = DateTime.Now; }