docs: public void stop() {
  		if (stopped) {
  			return;
  		}
  		this.stopped = true;
  		log.info("Stopping spidering process by request.");
  		
  		if (this.paused) {
  			// Have to resume first or we get a deadlock
  			this.resume();
  		}
  		
  		// Issue the shutdown command
  		this.threadPool.shutdown();
  		try {
  			if (!this.threadPool.awaitTermination(2, TimeUnit.SECONDS)) {
  				log.warn("Failed to await for all spider threads to stop in the given time (2s)...");
  				for (Runnable task : this.threadPool.shutdownNow()) {
  					((SpiderTask) task).cleanup();
  				}
  			}
  		} catch (InterruptedException ignore) {
  			log.warn("Interrupted while awaiting for all spider threads to stop...");
  		}
  		if (httpSender != null) {
  			this.getHttpSender().shutdown();
  			httpSender = null;
  		}
  
  		// Notify the controller to clean up memory
  		controller.reset();
  		this.threadPool = null;
  
  		// Notify the listeners -- in the meanwhile
  		notifyListenersSpiderComplete(false);
  	}