package com.intrbiz.lamplighter.reading; import java.util.LinkedList; import java.util.List; import java.util.UUID; import org.apache.log4j.Logger; import com.intrbiz.bergamot.model.message.reading.ReadingParcelMO; import com.intrbiz.bergamot.queue.WorkerQueue; import com.intrbiz.bergamot.queue.key.ReadingKey; import com.intrbiz.queue.Consumer; public abstract class AbstractReadingProcessor implements ReadingProcessor { private Logger logger = Logger.getLogger(AbstractReadingProcessor.class); private UUID instanceId = UUID.randomUUID(); private WorkerQueue workerQueue; private List<Consumer<ReadingParcelMO, ReadingKey>> readingConsumers = new LinkedList<Consumer<ReadingParcelMO, ReadingKey>>(); private List<Consumer<ReadingParcelMO, ReadingKey>> fallbackConsumers = new LinkedList<Consumer<ReadingParcelMO, ReadingKey>>(); private int threads = Runtime.getRuntime().availableProcessors(); public AbstractReadingProcessor() { super(); } @Override public int getThreads() { return threads; } @Override public void setThreads(int threads) { this.threads = threads; } @Override public void ownPool(UUID site, int pool) { for (Consumer<ReadingParcelMO, ReadingKey> consumer : this.readingConsumers) { consumer.addBinding(new ReadingKey(site, pool)); break; } } @Override public void disownPool(UUID site, int pool) { for (Consumer<ReadingParcelMO, ReadingKey> consumer : this.readingConsumers) { consumer.removeBinding(new ReadingKey(site, pool)); break; } } @Override public void start() { // setup the consumer logger.info("Creating readings consumer"); this.workerQueue = WorkerQueue.open(); // create the consumers for (int i = 0; i < this.getThreads(); i++) { // consume results, currently for all sites this.readingConsumers.add(this.workerQueue.consumeReadings((h, r) -> { logger.trace("Processing pooled/site readings"); processReadings(r); }, this.instanceId.toString())); // consume results, currently for all sites this.fallbackConsumers.add(this.workerQueue.consumeFallbackReadings((h, r) -> { logger.debug("Processing fallback readings"); processReadings(r); })); } } }