package com.hwlcn.ldap.ldap.sdk;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.net.SocketFactory;
import com.hwlcn.ldap.util.Debug;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
final class FastestConnectThread
extends Thread
{
private final AtomicBoolean connectionSelected;
private final BlockingQueue<Object> resultQueue;
private final int port;
private final LDAPConnection connection;
private final LDAPConnectionPoolHealthCheck healthCheck;
private final String address;
FastestConnectThread(final String address, final int port,
final SocketFactory socketFactory,
final LDAPConnectionOptions connectionOptions,
final LDAPConnectionPoolHealthCheck healthCheck,
final BlockingQueue<Object> resultQueue,
final AtomicBoolean connectionSelected)
{
super("Fastest Connect Thread for " + address + ':' + port);
setDaemon(true);
this.address = address;
this.port = port;
this.healthCheck = healthCheck;
this.resultQueue = resultQueue;
this.connectionSelected = connectionSelected;
connection = new LDAPConnection(socketFactory, connectionOptions);
}
@Override()
public void run()
{
boolean returned = false;
try
{
connection.connect(address, port);
if (healthCheck != null)
{
healthCheck.ensureNewConnectionValid(connection);
}
returned = (connectionSelected.compareAndSet(false, true) &&
resultQueue.offer(connection));
}
catch (final Exception e)
{
Debug.debugException(e);
resultQueue.offer(e);
}
finally
{
if (! returned)
{
connection.close();
}
}
}
}