package com.netflix.schlep.sim; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.netflix.schlep.Completion; import com.netflix.schlep.consumer.AbstractIncomingMessage; import com.netflix.schlep.consumer.PollingMessageConsumer; import com.netflix.schlep.consumer.IncomingMessage; /** * Simulates a message consumer by generating messages on a given interval * * @author elandau * */ public class SimMessageConsumer extends PollingMessageConsumer { private static final Logger LOG = LoggerFactory.getLogger(SimMessageConsumer.class); private final AtomicLong counter = new AtomicLong(); private final AtomicLong ackCounter = new AtomicLong(); private final int itemsToSend; /** * Builder * * @param <T> */ public static abstract class Builder<T extends Builder<T>> extends PollingMessageConsumer.Builder<T> { private int itemsToSend = 100; public T withMaxCount(int count) { this.itemsToSend = count; return self(); } public SimMessageConsumer build() { return new SimMessageConsumer(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(); } protected SimMessageConsumer(Builder<?> init) { super(init); this.itemsToSend = init.itemsToSend; } @Override protected List<IncomingMessage> readBatch(int batchSize) { List<IncomingMessage> messages = Lists.newArrayListWithCapacity(batchSize); for (int i = 0; i < batchSize; i++) { long count = counter.incrementAndGet(); if (count >= itemsToSend) break; messages.add(new AbstractIncomingMessage<String>(getId() + "-" + count) { @Override public <T> T getContents(Class<T> clazz) { Preconditions.checkArgument(clazz.equals(String.class), "Only string type allowed"); return (T) entity; } public String toString() { return "Sim[" + StringUtils.abbreviate(this.getContents(String.class), 32) + "]"; } }); } return messages; } @Override protected void sendAckBatch(List<Completion<IncomingMessage>> act) { LOG.info("Ack: " + act); } }