in src/NMS.AMQP/Provider/Failover/FailoverProvider.cs [104:184]
private Task TriggerReconnectionAttempt()
{
if (closed)
return Task.CompletedTask;
return reconnectControl.ScheduleReconnect(Reconnect);
async Task Reconnect()
{
IProvider provider = null;
Exception failure = null;
long reconnectAttempts = reconnectControl.RecordNextAttempt();
try
{
if (uris.Any())
{
for (int i = 0; i < uris.Size(); i++)
{
var target = uris.GetNext();
if (target == null)
{
Tracer.Debug("Failover URI collection unexpectedly modified during connection attempt.");
continue;
}
try
{
Tracer.Debug($"Connection attempt:[{reconnectAttempts}] to: {target.Scheme}://{target.Host}:{target.Port} in-progress");
provider = ProviderFactory.Create(target);
await provider.Connect(connectionInfo).Await();
await InitializeNewConnection(provider).Await();
return;
}
catch (Exception e)
{
Tracer.Info($"Connection attempt:[{reconnectAttempts}] to: {target.Scheme}://{target.Host}:{target.Port} failed");
failure = e;
try
{
provider?.Close();
}
catch
{
}
finally
{
provider = null;
}
}
}
}
else
{
Tracer.Debug("No remote URI available to connect to in failover list");
// TODO Handle this one.
failure = new IOException("No remote URI available for reconnection during connection attempt: " + reconnectAttempts);
}
}
catch (Exception unknownFailure)
{
Tracer.Warn($"Connection attempt:[{reconnectAttempts}] failed abnormally.");
failure = failure ?? unknownFailure;
}
finally
{
if (provider == null)
{
Tracer.Debug($"Connection attempt:[{reconnectControl.ReconnectAttempts}] failed error: {failure?.Message}");
if (!reconnectControl.IsReconnectAllowed(failure))
{
ReportReconnectFailure(failure);
}
else
{
await reconnectControl.ScheduleReconnect(Reconnect).Await();
}
}
}
}
}