package com.nexr.platform.search.provider; import com.nexr.platform.search.consumer.DataConsumer; import com.nexr.platform.search.consumer.DataConsumer.DataEvent; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; public abstract class StreamDataProvider<V> implements DataProvider<V> { private int _batchSize; protected DataConsumer<V> _consumer; private DataThread<V> _thread; public StreamDataProvider() { _batchSize=1; _consumer=null; } public void setDataConsumer(DataConsumer<V> consumer) { _consumer = consumer; } protected volatile long _produceCount; public long getProduceCount() { return _produceCount; } public abstract DataEvent<V> next(); public abstract void reset(); public void setBatchSize(int batchSize) { _batchSize=Math.max(1, batchSize); } public void start() { if (_thread==null || !_thread.isAlive()) { reset(); _thread = new DataThread<V>(this); _thread.start(); } } private static final class DataThread<V> extends Thread { private Collection<DataConsumer.DataEvent<V>> _batch; private final StreamDataProvider<V> _dataProvider; DataThread(StreamDataProvider<V> dataProvider) { super("Stream DataThread"); setDaemon(false); _dataProvider = dataProvider; _batch = new LinkedList<DataConsumer.DataEvent<V>>(); } @Override public void start() { super.start(); } private void flush() { Collection<DataEvent<V>> tmp = _batch; _batch = new LinkedList<DataConsumer.DataEvent<V>>(); try { if(_dataProvider._consumer != null) { _dataProvider._consumer.consume(tmp); } } catch (IOException e) { System.err.println(e.getMessage()); } } public void run() { while (!Thread.currentThread().isInterrupted()) { DataConsumer.DataEvent<V> data = _dataProvider.next(); if (data != null) { _batch.add(data); if (_batch.size()>=_dataProvider._batchSize) { flush(); } } else { flush(); // this.interrupt(); System.exit(0); } } } } }