package com.dgex.offspring.dataprovider.internal; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import com.dgex.offspring.dataprovider.service.IDataProvider; import com.dgex.offspring.dataprovider.service.IDataProviderPool; public class DataProviderPool implements IDataProviderPool { private static int scounter = 0; private static Logger logger = Logger.getLogger(DataProviderPool.class); private final List<IDataProvider> providers = new ArrayList<IDataProvider>(); private final ScheduledExecutorService scheduledThreadPool = Executors .newScheduledThreadPool(2); private boolean destroyed = false; /* Runs a single DataProvider every second */ private long intervalMilliseconds = 1000; public DataProviderPool() { scounter++; logger.info("new DataProviderPool #" + scounter); if (scounter > 1) { try { throw new Exception("Who ara you fool"); } catch (Exception e) { logger.error("Show your self", e); System.exit(-1); } } scheduledThreadPool.scheduleWithFixedDelay(runnable, 100, intervalMilliseconds, TimeUnit.MILLISECONDS); } private final Runnable runnable = new Runnable() { @Override public void run() { IDataProvider provider = getNextProvider(providers); if (!destroyed && provider != null) { try { provider.run(); } catch (Exception e) { logger.error("DataProviderPool exception. Provider: " + provider, e); } } } }; @Override public void destroy() { destroyed = true; scheduledThreadPool.shutdown(); } private static IDataProvider getNextProvider(List<IDataProvider> providers) { IDataProvider provider = null; long providerOverdue = 0l; for (IDataProvider p : providers) { long overdue = p.getTimeOverdue(); if (overdue > providerOverdue) { provider = p; providerOverdue = overdue; } } return provider; } @Override public int getProviderCount() { return providers.size(); } @Override public void addProvider(IDataProvider provider) { if (!providers.contains(provider)) providers.add(provider); } @Override public void removeProvider(IDataProvider provider) { providers.remove(provider); } @Override public void setIntervalMilliseconds(long interval) { intervalMilliseconds = interval; } @Override public long getIntervalMilliseconds() { return intervalMilliseconds; } @Override public List<IDataProvider> getProviders() { return providers; } }