in src/main/csharp/Transport/Failover/FailoverTransport.cs [752:891]
private bool DoConnect()
{
lock(reconnectMutex)
{
if(ConnectedTransport != null || disposed || connectionFailure != null)
{
return false;
}
else
{
List<Uri> connectList = ConnectList;
if(connectList.Count == 0)
{
Failure = new NMSConnectionException("No URIs available for connection.");
}
else
{
if(!UseExponentialBackOff)
{
ReconnectDelay = InitialReconnectDelay;
}
ITransport transport = null;
Uri chosenUri = null;
try
{
foreach(Uri uri in connectList)
{
if(ConnectedTransport != null || disposed)
{
break;
}
Tracer.DebugFormat("Attempting connect to: {0}", uri);
// synchronous connect
try
{
Tracer.DebugFormat("Attempting connect to: {0}", uri.ToString());
transport = TransportFactory.CompositeConnect(uri);
chosenUri = transport.RemoteAddress;
break;
}
catch(Exception e)
{
Failure = e;
Tracer.DebugFormat("Connect fail to: {0}, reason: {1}", uri, e.Message);
}
}
if(transport != null)
{
transport.Command = new CommandHandler(OnCommand);
transport.Exception = new ExceptionHandler(OnException);
transport.Start();
if(started)
{
RestoreTransport(transport);
}
if(this.Resumed != null)
{
this.Resumed(transport);
}
Tracer.Debug("Connection established");
ReconnectDelay = InitialReconnectDelay;
ConnectedTransportURI = chosenUri;
ConnectedTransport = transport;
connectFailures = 0;
connected = true;
if(firstConnection)
{
firstConnection = false;
Tracer.InfoFormat("Successfully connected to: {0}", chosenUri.ToString());
}
else
{
Tracer.InfoFormat("Successfully reconnected to: {0}", chosenUri.ToString());
}
return false;
}
}
catch(Exception e)
{
Failure = e;
Tracer.DebugFormat("Connect attempt failed. Reason: {0}", e.Message);
}
}
int maxAttempts = 0;
if( firstConnection ) {
if( StartupMaxReconnectAttempts != 0 ) {
maxAttempts = StartupMaxReconnectAttempts;
}
}
if( maxAttempts == 0 ) {
maxAttempts = MaxReconnectAttempts;
}
if(maxAttempts > 0 && ++connectFailures >= maxAttempts)
{
Tracer.ErrorFormat("Failed to connect to transport after {0} attempt(s)", connectFailures);
connectionFailure = Failure;
this.Exception(this, connectionFailure);
return false;
}
}
}
if(!disposed)
{
Tracer.DebugFormat("Waiting {0}ms before attempting connection.", ReconnectDelay);
lock(sleepMutex)
{
try
{
Thread.Sleep(ReconnectDelay);
}
catch(Exception)
{
}
}
if(UseExponentialBackOff)
{
// Exponential increment of reconnect delay.
ReconnectDelay *= ReconnectDelayExponent;
if(ReconnectDelay > MaxReconnectDelay)
{
ReconnectDelay = MaxReconnectDelay;
}
}
}
return !disposed;
}