/**
   * Used by the indexing thread to flush incoming data events in batch. A flush is carried out when
   * the batch size is significant, a client requesting a flush, or significant amount of time has
   * passed. The data is flushed to the underlying dataloader, which is a DataConsumer.
   */
  protected void processBatch() {
    List<DataEvent<ZoieIndexable>> tmpList = null;
    long now = System.currentTimeMillis();
    long duration = now - _lastFlushTime;

    synchronized (this) {
      while (_batchList.size() < _batchSize && !_stop && !_flush && duration < _delay) {
        try {
          this.wait(_delay - duration);
        } catch (InterruptedException e) {
          log.warn(e.getMessage());
        }
        now = System.currentTimeMillis();
        duration = now - _lastFlushTime;
      }
      _flush = false;
      _lastFlushTime = now;

      if (_batchList.size() > 0) {
        // change the status and get the batch list
        // this has to be done in the block synchronized on BatchIndexDataLoader
        _idxMgr.setDiskIndexerStatus(SearchIndexManager.Status.Working);
        tmpList = getBatchList();
      }
    }

    if (tmpList != null) {
      long t1 = System.currentTimeMillis();
      int eventCount = tmpList.size();
      try {
        _dataLoader.consume(tmpList);
      } catch (ZoieException e) {
        log.error(e.getMessage(), e);
      } finally {
        long t2 = System.currentTimeMillis();
        synchronized (this) {
          _eventCount -= eventCount;
          log.info(
              this
                  + " flushed batch of "
                  + eventCount
                  + " events to disk indexer, took: "
                  + (t2 - t1)
                  + " current event count: "
                  + _eventCount);
          IndexUpdatedEvent evt = new IndexUpdatedEvent(eventCount, t1, t2, _eventCount);
          fireIndexingEvent(evt);
          this.notifyAll();
        }
      }
    } else {
      log.debug("batch size is 0");
    }
  }
    private void flush() {
      // FLUSH
      Collection<DataEvent<V>> tmp;
      tmp = _batch;
      _batch = new LinkedList<DataEvent<V>>();

      try {
        if (_dataProvider._consumer != null) {
          _eventCount.getAndAdd(tmp.size());
          _dataProvider._consumer.consume(tmp);
        }
      } catch (ZoieException e) {
        log.error(e.getMessage(), e);
      }
    }