private void PublishSubscriptions(object data)
{
try
{
// Utils.Trace("Server: Publish Subscriptions Thread Started.");
int sleepCycle = Convert.ToInt32(data, CultureInfo.InvariantCulture);
int timeToWait = sleepCycle;
do
{
DateTime start = DateTime.UtcNow;
SessionPublishQueue[] queues = null;
Subscription[] abandonedSubscriptions = null;
lock (m_lock)
{
// check if halted.
if (m_publishingThread == null)
{
return;
}
// collect active session queues.
queues = new SessionPublishQueue[m_publishQueues.Count];
m_publishQueues.Values.CopyTo(queues, 0);
// collect abandoned subscriptions.
if (m_abandonedSubscriptions != null && m_abandonedSubscriptions.Count > 0)
{
abandonedSubscriptions = new Subscription[m_abandonedSubscriptions.Count];
for (int ii = 0; ii < abandonedSubscriptions.Length; ii++)
{
abandonedSubscriptions[ii] = m_abandonedSubscriptions[ii];
}
}
}
// check the publish timer for each subscription.
for (int ii = 0; ii < queues.Length; ii++)
{
queues[ii].PublishTimerExpired();
}
// check the publish timer for each abandoned subscription.
if (abandonedSubscriptions != null)
{
List<Subscription> subscriptionsToDelete = new List<Subscription>();
for (int ii = 0; ii < abandonedSubscriptions.Length; ii++)
{
Subscription subscription = abandonedSubscriptions[ii];
if (subscription.PublishTimerExpired() != PublishingState.Expired)
{
continue;
}
if (subscriptionsToDelete == null)
{
subscriptionsToDelete = new List<Subscription>();
}
subscriptionsToDelete.Add(subscription);
SubscriptionExpired(subscription);
Utils.Trace("Server: Abandoned Subscription '{0}' Delete Scheduled.", subscription.Id);
}
// schedule cleanup on a background thread.
if (subscriptionsToDelete.Count > 0)
{
lock (m_lock)
{
for (int ii = 0; ii < subscriptionsToDelete.Count; ii++)
{
m_abandonedSubscriptions.Remove(subscriptionsToDelete[ii]);
}
}
CleanupSubscriptions(m_server, subscriptionsToDelete);
}
}
if (m_shutdownEvent.WaitOne(timeToWait, false))
{
Utils.Trace("Server: Publish Subscriptions Thread Exited Normally.");
break;
}
int delay = (int)(DateTime.UtcNow - start).TotalMilliseconds;
timeToWait = sleepCycle;
}
while (true);
}
catch (Exception e)
{
Utils.Trace(e, "Server: Publish Subscriptions Thread Exited Unexpectedly");
}
}