code: @Override
    public void processEvent(QueryBatch batch) {
      try ( DocumentPage docs = getDocs(batch) ) {
        while ( docs.hasNext() ) {
          for ( Consumer<DocumentRecord> listener : exportListeners ) {
            try {
              listener.accept(docs.next());
            } catch (Throwable t) {
              logger.error("Exception thrown by an onDocumentReady listener", t);
            }
          }
        }
      } catch (Throwable t) {
        for ( BatchFailureListener<Batch<String>> listener : failureListeners ) {
          try {
            listener.processFailure(batch, t);
          } catch (Throwable t2) {
            logger.error("Exception thrown by an onBatchFailure listener", t2);
          }
        }
        for ( BatchFailureListener<QueryBatch> queryBatchFailureListener : queryBatchFailureListeners ) {
          try {
            queryBatchFailureListener.processFailure(batch, t);
          } catch (Throwable t2) {
            logger.error("Exception thrown by an onFailure listener", t2);
          }
        }
      }
    }
docs: This is the method QueryBatcher calls for ExportListener to do its
  thing.  You should not need to call it.
  
  @param batch the batch of uris and some metadata about the current status of the job