Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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;
        }