package com.netflix.schlep.sim; import java.util.List; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.schlep.producer.ConcurrentMessageProducer; /** * Simulated message writer * * @author elandau * */ public class SimMessageProducer extends ConcurrentMessageProducer { private static final Logger LOG = LoggerFactory.getLogger(SimMessageProducer.class); public static abstract class Builder<T extends Builder<T>> extends ConcurrentMessageProducer.Builder<T> { private long writeDelay = 100; public T withWriteDelay(long writeDelay, TimeUnit units) { this.writeDelay = units.toMillis(writeDelay); return self(); } public SimMessageProducer build() { return new SimMessageProducer(this); } } /** * BuilderWrapper to link with subclass Builder * @author elandau * */ private static class BuilderWrapper extends Builder<BuilderWrapper> { @Override protected BuilderWrapper self() { return this; } } public static Builder<?> builder() { return new BuilderWrapper(); } private final long writeDelay; protected SimMessageProducer(final Builder<?> init) { super(init); this.writeDelay = init.writeDelay; } @Override protected void sendMessages(List<ObservableCompletion> messages) { // Introduce a delay try { Thread.sleep(writeDelay); } catch (InterruptedException e) { LOG.error(e.getMessage(), e); } // Ack each message for (ObservableCompletion completion : messages) { try { LOG.info("Write: " + completion.getValue()); } catch(Throwable t) { LOG.error(t.getMessage(), t); completion.setError(t); } completion.done(); } } }