protected virtual void OnKeepAlive(ServerState currentState, DateTime currentTime)
{
// restart publishing if keep alives recovered.
if (KeepAliveStopped)
{
// ignore if already reconnecting.
if (m_reconnecting)
{
return;
}
int count = 0;
lock (m_outstandingRequests)
{
for (LinkedListNode<AsyncRequestState> ii = m_outstandingRequests.First; ii != null; ii = ii.Next)
{
if (ii.Value.RequestTypeId == DataTypes.PublishRequest)
{
ii.Value.Defunct = true;
}
}
}
lock (SyncRoot)
{
count = m_subscriptions.Count;
}
while (count-- > 0)
{
BeginPublish(OperationTimeout);
}
}
KeepAliveEventHandler callback = null;
lock (m_eventLock)
{
callback = m_KeepAlive;
// save server state.
m_serverState = currentState;
m_lastKeepAliveTime = DateTime.UtcNow;
}
if (callback != null)
{
try
{
callback(this, new KeepAliveEventArgs(null, currentState, currentTime));
}
catch (Exception e)
{
Utils.Trace(e, "Session: Unexpected error invoking KeepAliveCallback.");
}
}
}