public virtual void SessionClosing(OperationContext context, NodeId sessionId, bool deleteSubscriptions)
{
// close the publish queue for the session.
SessionPublishQueue queue = null;
IList<Subscription> subscriptionsToDelete = null;
lock (m_lock)
{
if (m_publishQueues.TryGetValue(sessionId, out queue))
{
m_publishQueues.Remove(sessionId);
subscriptionsToDelete = queue.Close();
// remove the subscriptions.
if (deleteSubscriptions && subscriptionsToDelete != null)
{
for (int ii = 0; ii < subscriptionsToDelete.Count; ii++)
{
m_subscriptions.Remove(subscriptionsToDelete[ii].Id);
}
}
}
}
//remove the expired subscription status change notifications for this session
lock (m_statusMessages)
{
Queue<StatusMessage> statusQueue = null;
if (m_statusMessages.TryGetValue(sessionId, out statusQueue))
{
m_statusMessages.Remove(sessionId);
}
}
// process all subscriptions in the queue.
if (subscriptionsToDelete != null)
{
for (int ii = 0; ii < subscriptionsToDelete.Count; ii++)
{
Subscription subscription = subscriptionsToDelete[ii];
// delete the subscription.
if (deleteSubscriptions)
{
// raise subscription event.
RaiseSubscriptionEvent(subscription, true);
// delete subscription.
subscription.Delete(context);
}
// mark the subscriptions as abandoned.
else
{
lock (m_lock)
{
if (m_abandonedSubscriptions == null)
{
m_abandonedSubscriptions = new List<Subscription>();
}
m_abandonedSubscriptions.Add(subscription);
Utils.Trace("Server: Subscription '{0}' Abandoned.", subscription.Id);
}
}
}
}
}