/******************************************************************************* * Copyright © 2012-2015 eBay Software Foundation * This program is dual licensed under the MIT and Apache 2.0 licenses. * Please see LICENSE for more information. *******************************************************************************/ package com.ebay.jetstream.batcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import com.ebay.jetstream.util.disruptor.SingleConsumerDisruptorQueue; /** * @author shmurthy@ebay.com - queue that holds items to be batched by the AutoFlushBatcher */ public class AutoFlushWriterQueue<T> { private SingleConsumerDisruptorQueue m_queue; // LinkedBlockingQueue<T> m_queue = new LinkedBlockingQueue<T>(); private int m_maxQueueSz = 100000; private AtomicInteger m_maxFlushSz = new AtomicInteger(40); private AtomicLong m_lastFlushTime = new AtomicLong(0); public int getMaxFlushSz() { return m_maxFlushSz.get(); } public void setMaxFlushSz(int m_maxFlushSz) { this.m_maxFlushSz.set(m_maxFlushSz); } public int getMaxQueueSz() { return m_maxQueueSz; } public void setMaxQueueSz(int maxQueueSz) { m_maxQueueSz = maxQueueSz; } public long getLastFlushTime() { return m_lastFlushTime.get(); } public void setLastFlushTime(long lastFlushTime) { this.m_lastFlushTime.set(lastFlushTime); } public AutoFlushWriterQueue() { this(100, 10000); } public AutoFlushWriterQueue(int maxFlushSz, int maxQueueSz) { m_maxFlushSz.set(maxFlushSz); m_maxQueueSz = maxQueueSz; m_queue = new SingleConsumerDisruptorQueue(maxQueueSz); } /** * return true if time to flush else return false * * @param e * @return * @throws Exception */ public void add(T e) throws Exception { if (m_queue.size() < m_maxQueueSz) { m_queue.offer(e); } else throw new Exception("Queue Full"); } /** * @return true if bufsize is >= max flush buf size else false */ public boolean isTimeToFlush() { if (m_queue.size() >= m_maxFlushSz.get()) { return true; } else return false; } public int size() { return m_queue.size(); } /** * @return */ public List<T> get(int count) { if (m_queue.isEmpty()) return null; ArrayList l = new ArrayList(count); m_queue.drainTo(l, count); return l; } /** * */ public void clear() { m_queue.clear(); } }