package com.netflix.schlep.consumer; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import com.google.common.base.Function; import com.netflix.schlep.Completion; import rx.Observable; import rx.Subscription; public class OneMessageConsumer implements MessageConsumer { private AtomicReference<MessageHandler> observer = new AtomicReference<MessageHandler>(); private final AtomicInteger nextMessageCount = new AtomicInteger(0); private final AtomicInteger ackMessageCount = new AtomicInteger(0); private final AtomicInteger nakMessageCount = new AtomicInteger(0); private final String id; public OneMessageConsumer(String id) { this.id = id; } @Override public void start() throws Exception { MessageHandler observer = this.observer.get(); if (observer == null) { throw new RuntimeException("No observer found"); } observer.call(new IncomingMessage() { { nextMessageCount.incrementAndGet(); } @Override public long getTimeSinceReceived(TimeUnit units) { return 0; } @Override public <T> T getContents(Class<T> clazz) { if (clazz != String.class) throw new RuntimeException("Only String messages allowed here"); return (T)"Message"; } }); } public int getAckCount() { return ackMessageCount.get(); } public int getNakCount() { return nakMessageCount.get(); } public int getOnNextCount() { return nextMessageCount.get(); } @Override public void stop() throws Exception { } @Override public void pause() throws Exception { } @Override public void resume() throws Exception { } @Override public boolean isStarted() { return false; } @Override public String getId() { return id; } @Override public Subscription subscribe(MessageHandler handler) { if (this.observer.compareAndSet(null, handler)) { return new Subscription() { @Override public void unsubscribe() { observer.set(null); } }; } else { throw new RuntimeException("Only one observer may be registered"); } } @Override public Subscription subscribe(final Function<IncomingMessage, Boolean> handler) { return subscribe(new MessageHandler() { @Override public Observable<Completion<IncomingMessage>> call(IncomingMessage message) { handler.apply(message); return Observable.from(Completion.from(message)); } }); } }