package com.ldbc.driver.runtime;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.LockSupport;
public abstract class QueueEventFetcher<EVENT_TYPE> {
public abstract EVENT_TYPE fetchNextEvent() throws InterruptedException;
public static <TYPE> QueueEventFetcher<TYPE> queueEventFetcherFor(Queue<TYPE> queue) {
return (BlockingQueue.class.isAssignableFrom(queue.getClass()))
? new BlockingQueueEventFetcher((BlockingQueue) queue)
: new NonBlockingQueueEventFetcher(queue);
}
static class NonBlockingQueueEventFetcher<EVENT_TYPE_NON_BLOCKING> extends QueueEventFetcher<EVENT_TYPE_NON_BLOCKING> {
private final Queue<EVENT_TYPE_NON_BLOCKING> queue;
public NonBlockingQueueEventFetcher(Queue<EVENT_TYPE_NON_BLOCKING> queue) {
this.queue = queue;
}
@Override
public EVENT_TYPE_NON_BLOCKING fetchNextEvent() throws InterruptedException {
EVENT_TYPE_NON_BLOCKING event;
while (null == (event = queue.poll())) {
LockSupport.parkNanos(1);
}
return event;
}
}
static class BlockingQueueEventFetcher<EVENT_TYPE_BLOCKING> extends QueueEventFetcher<EVENT_TYPE_BLOCKING> {
private final BlockingQueue<EVENT_TYPE_BLOCKING> queue;
public BlockingQueueEventFetcher(BlockingQueue<EVENT_TYPE_BLOCKING> queue) {
this.queue = queue;
}
@Override
public EVENT_TYPE_BLOCKING fetchNextEvent() throws InterruptedException {
return queue.take();
}
}
}