code: protected final void doStop() {
  
          log.info("Stopping {} in {}", new Object[]{this, getLocationOrNull()});
  
          if (getAttribute(SERVICE_STATE_ACTUAL)
                  .equals(Lifecycle.STOPPED)) {
              log.warn("The entity {} is already stopped", new Object[]{this});
              return;
          }
  
          ServiceStateLogic.setExpectedState(this, Lifecycle.STOPPING);
          try {
              preStop();
              driver.stop();
              postDriverStop();
              postStop();
              ServiceStateLogic.setExpectedState(this, Lifecycle.STOPPED);
              log.info("The entity stop operation {} is completed without errors",
                      new Object[]{this});
          } catch (Throwable t) {
              ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE);
              throw Exceptions.propagate(t);
          }
      }
docs: To be overridden instead of {@link #stop()}; sub-classes should call {@code super.doStop()}
  and should add do additional work via tasks, executed using
  {@link brooklyn.util.task.DynamicTasks#queue(String, java.util.concurrent.Callable)}.