in src/NMS.AMQP/Provider/Failover/FailoverProvider.cs [202:250]
private async Task InitializeNewConnection(IProvider provider)
{
if (closed)
{
try
{
provider.Close();
}
catch (Exception e)
{
Tracer.Debug($"Ignoring failure to close failed provider: {provider} {e.Message}");
}
return;
}
this.provider = provider;
this.provider.SetProviderListener(this);
this.connectedUri = provider.RemoteUri;
if (reconnectControl.IsRecoveryRequired())
{
Tracer.Debug($"Signalling connection recovery: {provider}");
// Allow listener to recover its resources
await listener.OnConnectionRecovery(provider).Await();
// Restart consumers, send pull commands, etc.
await listener.OnConnectionRecovered(provider).Await();
// Let the client know that connection has restored.
listener.OnConnectionRestored(connectedUri);
// If we try to run pending requests right after the connection is reestablished
// it will result in timeout on the first send request
await Task.Delay(50).Await();
foreach (FailoverRequest request in GetPendingRequests())
{
await request.Run().Await();
}
reconnectControl.ConnectionEstablished();
}
else
{
listener.OnConnectionEstablished(connectedUri);
reconnectControl.ConnectionEstablished();
}
}