public void connect(final PingClientHandler clientHandler) {
final Queue q;
final ScheduledExecutorService re;
final boolean shouldCloseQueue;
final ReadyFactory rf;
final InternalPingServerReadyFactory readyFactoryToClose;
if (readyFactory == null) {
readyFactoryToClose = new InternalPingServerReadyFactory();
rf = readyFactoryToClose;
} else {
rf = readyFactory;
readyFactoryToClose = null;
}
if (queue == null) {
try {
q = new Queue();
} catch (IOException e) {
clientHandler.failed(e);
return;
}
re = Executors.newSingleThreadScheduledExecutor();
shouldCloseQueue = true;
} else {
q = queue;
re = repeatExecutor;
shouldCloseQueue = false;
}
final Address a;
if (host != null) {
if (port < 0) {
a = new Address(host, address.getPort());
} else {
a = new Address(host, port);
}
} else {
a = address;
}
final Set<InstanceMapper> instanceMappers = new HashSet<>();
re.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
q.post(new Runnable() {
@Override
public void run() {
Date now = new Date();
for (InstanceMapper i : instanceMappers) {
i.repeat(now, minTimeToRepeat, timeoutFromBeginning);
}
Iterator<InstanceMapper> ii = instanceMappers.iterator();
while (ii.hasNext()) {
InstanceMapper i = ii.next();
if (i.instances.isEmpty()) {
ii.remove();
}
}
}
});
}
}, 0, (long) (repeatTime * 1000d), TimeUnit.MILLISECONDS);
q.post(new Runnable() {
@Override
public void run() {
ByteBufferAllocator allocator = new OnceByteBufferAllocator();
Ready ready = rf.create(q, allocator);
ready.connect(a, new ReadyConnection() {
private final InstanceMapper instanceMapper = new InstanceMapper();
@Override