package com.appmetr.hercules.partition; import com.appmetr.hercules.Hercules; import com.appmetr.hercules.mutations.ExecutableMutation; import com.appmetr.hercules.mutations.MutationsQueue; import com.google.inject.Inject; import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.MessageFormat; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Singleton public class PartitioningStarter implements Runnable { private Logger logger = LoggerFactory.getLogger(PartitioningStarter.class); private MutationsQueue mutationsQueue; private Hercules hercules; private volatile Thread pollingThread = null; private final Lock lock = new ReentrantLock(); private final Condition trigger = lock.newCondition(); private static final long RUN_PERIOD = 1000 * 60 * 60; @Inject public PartitioningStarter(MutationsQueue mutationsQueue, Hercules hercules) { this.mutationsQueue = mutationsQueue; this.hercules = hercules; } @Override public void run() { pollingThread = Thread.currentThread(); while (!pollingThread.isInterrupted()) { lock.lock(); try { addPartitions(); trigger.await(RUN_PERIOD, TimeUnit.MILLISECONDS); } catch (InterruptedException ie) { pollingThread.interrupt(); } finally { lock.unlock(); } } } public void trigger() { lock.lock(); try { trigger.signal(); } finally { lock.unlock(); } } private void addPartitions() { logger.info(MessageFormat.format("PartitioningJob started at {0}", new Date())); try { List<ExecutableMutation> mutations = new LinkedList<ExecutableMutation>(); mutations.addAll(hercules.getPartitionMutations()); for (ExecutableMutation mutation : mutations) { mutation.setPriority(MutationsQueue.DEFAULT_PRIORITY); } mutationsQueue.addAll(mutations); } catch (Exception e) { logger.error("Exception occurred while creating partitions", e); } logger.info("PartitioningJob finished"); } public void stop() { logger.info("EventIncomingsFlusher stopped!"); if (pollingThread != null) { pollingThread.interrupt(); } } }