package org.arangodb.objectmapper.http;
import java.lang.ref.WeakReference;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import org.apache.http.conn.*;
/**
* Original file from "Java API for CouchDB http://www.ektorp.org"
*
* @author henrik lundgren
*
*/
public class IdleConnectionMonitor {
private final static long DEFAULT_IDLE_CHECK_INTERVAL = 30;
private final static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() {
private final AtomicInteger threadCount = new AtomicInteger(0);
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
t.setName(String.format("arangodb-idle-connection-monitor-thread-%s", threadCount.incrementAndGet()));
return t;
}
});
public static void monitor(ClientConnectionManager cm) {
CleanupTask cleanupTask = new CleanupTask(cm);
ScheduledFuture<?> cleanupFuture = executorService.scheduleWithFixedDelay(cleanupTask, DEFAULT_IDLE_CHECK_INTERVAL,
DEFAULT_IDLE_CHECK_INTERVAL, TimeUnit.SECONDS);
cleanupTask.setFuture(cleanupFuture);
}
private static class CleanupTask implements Runnable {
private final WeakReference<ClientConnectionManager> cm;
private ScheduledFuture<?> thisFuture;
CleanupTask(ClientConnectionManager cm) {
this.cm = new WeakReference<ClientConnectionManager>(cm);
}
public void setFuture(ScheduledFuture<?> future) {
thisFuture = future;
}
public void run() {
if (cm.get() != null) {
cm.get().closeExpiredConnections();
} else if (thisFuture != null) {
thisFuture.cancel(false);
}
}
}
}