code: @Override
      public void close() throws DataSourceReadException {
          try {
              super.close();
          } finally {
              List<DataSourceReadException> exceptions =
                      new ArrayList<>();
              for (DataStreamingEventIterator<UniqueIdPair> it : this.refs) {
                  try {
                      it.close();
                  } catch (DataSourceReadException ex) {
                      exceptions.add(ex);
                  }
              }
              if (!exceptions.isEmpty()) {
                  DataSourceReadException ex = new DataSourceReadException(
                          "Error occurred reading from data source");
                  List<StackTraceElement> elts = new ArrayList<>();
                  for (DataSourceReadException subex : exceptions) {
                      Arrays.addAll(elts, subex.getStackTrace());
                  }
                  ex.setStackTrace(elts.toArray(new StackTraceElement[elts.size()]));
                  throw ex;
              }
          }
      }
docs: Closes resources associated with the iterators specified in the
  constructor. Subclasses that override this method must call
  <code>super.close()</code> to ensure that those resources are cleaned up
  properly.
  
  @throws DataSourceReadException if an error occurred closing resources.