code: private void dispose(final Throwable cause) {
          assertUnlocked();
          
          lock.lock();
          try {
              if (procThreads == null) {
                  // Already disposed
                  return;
              }
              for (RequestProcessor processor : procThreads) {
                  processor.dispose();
              }
              procThreads = null;
          } finally {
              lock.unlock();
          }
  
          if (cause == null) {
              fireConnectionClosed();
          } else {
              fireConnectionClosedOnError(cause);
          }
  
          lock.lock();
          try {
              clearEmptyRequest();
              exchanges = null;
              cmParams = null;
              pendingResponseAcks = null;
              pendingRequestAcks = null;
              notEmpty.signalAll();
              notFull.signalAll();
              drained.signalAll();
          } finally {
              lock.unlock();
          }
          
          httpSender.destroy();
          schedExec.shutdownNow();
      }
docs: Destroy this session.
  
  @param cause the reason for the session termination, or {@code null}
  for normal termination