package cz.cuni.mff.d3s.been.objectrepository; import cz.cuni.mff.d3s.been.persistence.SuccessAction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An ephemerous consumer thread (it dies once consumable objects run out) * * @param <T> Type of consumed objects */ public class EphemerousConsumer<T> extends Consumer<T> { private static final Logger log = LoggerFactory.getLogger(EphemerousConsumer.class); protected final Poll<T> poll; /** * Create an ephemerous consumer * * @param poll Poll action that gets new consumable objects * @param successAction The action to perform on consumed objects * @param failAction The action to perform on consumed objects in case the success action fails * @param failRateMonitor Monitor counting the rate of failures in executed actions */ public EphemerousConsumer(Poll<T> poll, SuccessAction<T> successAction, FailAction<T> failAction, FailRate failRateMonitor) { super(successAction, failAction, failRateMonitor); this.poll = poll; } @Override public void run() { try { doRun(); } catch (Throwable t) { log.error("Ephemerous consumer thread died.", t); } } private void doRun() throws Throwable { log.debug("Thread starting."); while (!Thread.currentThread().isInterrupted()) { final T item = poll.perform(); if (item == null) { // there is nothing to do, end execution (this thread is ephemerous) break; } else { if (!act(item)) { break; } } } log.debug("Thread terminating."); } }