in src/main/csharp/Connection.cs [559:644]
internal void CheckConnected()
{
if(closed.Value)
{
throw new ConnectionClosedException();
}
if(!connected.Value)
{
DateTime timeoutTime = DateTime.Now + this.RequestTimeout;
int waitCount = 1;
while(true)
{
if(Monitor.TryEnter(connectedLock))
{
try
{
if(closed.Value || closing.Value)
{
break;
}
else if(!connected.Value)
{
if(!this.userSpecifiedClientID)
{
this.info.ClientId = this.clientIdGenerator.GenerateId();
}
try
{
if(null != transport)
{
// Make sure the transport is started.
if(!this.transport.IsStarted)
{
this.transport.Start();
}
// Send the connection and see if an ack/nak is returned.
Response response = transport.Request(this.info, this.RequestTimeout);
if(!(response is ExceptionResponse))
{
connected.Value = true;
}
else
{
ExceptionResponse error = response as ExceptionResponse;
NMSException exception = CreateExceptionFromBrokerError(error.Exception);
// This is non-recoverable.
// Shutdown the transport connection, and re-create it, but don't start it.
// It will be started if the connection is re-attempted.
this.transport.Stop();
ITransport newTransport = TransportFactory.CreateTransport(this.brokerUri);
SetTransport(newTransport);
throw exception;
}
}
}
catch
{
}
}
}
finally
{
Monitor.Exit(connectedLock);
}
}
if(connected.Value || closed.Value || closing.Value || DateTime.Now > timeoutTime)
{
break;
}
// Back off from being overly aggressive. Having too many threads
// aggressively trying to connect to a down broker pegs the CPU.
Thread.Sleep(5 * (waitCount++));
}
if(!connected.Value)
{
throw new ConnectionClosedException();
}
}
}