public void PublishTimerExpired()
{
List<Subscription> subscriptionsToDelete = new List<Subscription>();
lock (m_lock)
{
List<QueuedSubscription> liveSubscriptions = new List<QueuedSubscription>(m_queuedSubscriptions.Count);
// check each available subscription.
for (int ii = 0; ii < m_queuedSubscriptions.Count; ii++)
{
QueuedSubscription subscription = m_queuedSubscriptions[ii];
PublishingState state = subscription.Subscription.PublishTimerExpired();
// check for expired subscription.
if (state == PublishingState.Expired)
{
subscriptionsToDelete.Add(subscription.Subscription);
((SubscriptionManager)m_server.SubscriptionManager).SubscriptionExpired(subscription.Subscription);
continue;
}
liveSubscriptions.Add(subscription);
// check if idle.
if (state == PublishingState.Idle)
{
subscription.ReadyToPublish = false;
continue;
}
// do nothing if subscription has already been flagged as available.
if (subscription.ReadyToPublish)
{
if (subscription.ReadyToPublish && m_queuedRequests.Count == 0)
{
if (!m_subscriptionsWaiting)
{
m_subscriptionsWaiting = true;
// TraceState("SUBSCRIPTIONS WAITING");
}
}
continue;
}
// assign subscription to request if one is available.
if (!subscription.Publishing)
{
AssignSubscriptionToRequest(subscription);
}
}
// only keep the live subscriptions.
m_queuedSubscriptions = liveSubscriptions;
// schedule cleanup on a background thread.
SubscriptionManager.CleanupSubscriptions(m_server, subscriptionsToDelete);
}
}