code: @Override
      public void close() {
          if (!this.closed.getAndSet(true)) {
              this.metricReporter.cancel(true);
              this.metrics.close();
              this.rolloverProcessor.close();
              this.writeProcessor.close();
  
              // Close active ledger.
              WriteLedger writeLedger;
              synchronized (this.lock) {
                  writeLedger = this.writeLedger;
                  this.writeLedger = null;
                  this.logMetadata = null;
              }
  
              // Close the write queue and cancel the pending writes.
              this.writes.close().forEach(w -> w.fail(new CancellationException("BookKeeperLog has been closed."), true));
  
              if (writeLedger != null) {
                  try {
                      Ledgers.close(writeLedger.ledger);
                  } catch (DurableDataLogException bkEx) {
                      log.error("{}: Unable to close LedgerHandle for Ledger {}.", this.traceObjectId, writeLedger.ledger.getId(), bkEx);
                  }
              }
  
              log.info("{}: Closed.", this.traceObjectId);
          }
      }
docs: region AutoCloseable Implementation