in src/NMS.AMQP/Provider/Failover/FailoverProvider.cs [515:562]
internal void HandleProviderError(IProvider provider, NMSException cause)
{
if (closed)
return;
lock (SyncRoot)
{
// It is possible that another failed request signaled an error for the same provider
// and we already cleaned up the old failed provider and scheduled a reconnect that
// has already succeeded, so we need to ensure that we don't kill a valid provider.
if (provider == this.provider)
{
Tracer.Debug($"handling Provider failure: {cause.ToString()}");
this.provider = null;
provider.SetProviderListener(null);
Uri failedUri = provider.RemoteUri;
try
{
provider.Close();
}
catch (Exception exception)
{
Tracer.Debug($"Caught exception while closing failed provider: {exception.Message}");
}
if (reconnectControl.IsReconnectAllowed(cause))
{
// Start watching for request timeouts while we are offline, unless we already are.
foreach (FailoverRequest failoverRequest in GetPendingRequests())
{
failoverRequest.ScheduleTimeout();
}
TriggerReconnectionAttempt();
listener?.OnConnectionInterrupted(failedUri);
}
else
{
listener?.OnConnectionFailure(cause);
}
}
else
{
Tracer.Debug($"Ignoring duplicate provider failed event for provider: {provider}");
}
}
}