package edu.brown.hstore.dispatchers; import java.util.Arrays; import java.util.concurrent.LinkedBlockingDeque; import org.apache.log4j.Logger; import edu.brown.hstore.HStoreCoordinator; import edu.brown.hstore.HStoreSite; import edu.brown.hstore.util.AbstractProcessingRunnable; import edu.brown.utils.ClassUtil; /** * A dispatcher is a asynchronous processor for a specific type of message from * the HStoreCoordinator * @author pavlo * @param <E> */ public abstract class AbstractDispatcher<E> extends AbstractProcessingRunnable<E> { private static final Logger LOG = Logger.getLogger(AbstractDispatcher.class); protected final HStoreCoordinator hstore_coordinator; /** * @param hstore_site */ public AbstractDispatcher(HStoreSite hstore_site, HStoreCoordinator hstore_coordinator) { super(hstore_site, "dispatcher", new LinkedBlockingDeque<E>(), hstore_site.getHStoreConf().site.exec_profiling); this.hstore_coordinator = hstore_coordinator; } protected final void processingCallback(E e) { try { this.runImpl(e); } catch (Throwable ex) { String dump = null; if (ClassUtil.isArray(e)) { dump = Arrays.toString((Object[])e); } else if (e != null) { dump = e.toString(); } LOG.warn("Failed to process queued element: " + dump, ex); } } public final void queue(E e) { this.queue.offer(e); } public abstract void runImpl(E e); }