private void listenDriveState(FlowletRuntimeService driver) {
    driver.addListener(
        new ServiceListenerAdapter() {
          @Override
          public void running() {
            started();
          }

          @Override
          public void failed(Service.State from, Throwable failure) {
            LOG.error("Flowlet terminated with exception", failure);
            error(failure);
          }

          @Override
          public void terminated(Service.State from) {
            if (getState() != State.STOPPING) {
              LOG.warn("Flowlet terminated by itself");
              // Close all consumers
              for (ConsumerSupplier consumerSupplier : consumerSuppliers) {
                Closeables.closeQuietly(consumerSupplier);
              }
            }
          }
        },
        Threads.SAME_THREAD_EXECUTOR);
  }
 @Override
 protected void doStop() throws Exception {
   LOG.info("Stopping flowlet: " + flowletContext);
   try {
     driver.stopAndWait();
   } finally {
     // Close all consumers
     for (ConsumerSupplier consumerSupplier : consumerSuppliers) {
       Closeables.closeQuietly(consumerSupplier);
     }
     flowletContext.close();
   }
   LOG.info("Flowlet stopped: " + flowletContext);
 }
 @Override
 protected void doResume() throws Exception {
   LOG.info("Resuming flowlet: " + flowletContext);
   // Open producers
   for (ProducerSupplier producerSupplier : producerSuppliers) {
     producerSupplier.open();
   }
   // Open consumers
   for (ConsumerSupplier consumerSupplier : consumerSuppliers) {
     consumerSupplier.open(flowletContext.getInstanceCount());
   }
   driver.resume();
   LOG.info("Flowlet resumed: " + flowletContext);
 }
 @Override
 protected void doSuspend() throws Exception {
   LOG.info("Suspending flowlet: " + flowletContext);
   driver.suspend();
   // Close all producers
   for (ProducerSupplier producerSupplier : producerSuppliers) {
     producerSupplier.close();
   }
   // Close all consumers
   for (ConsumerSupplier consumerSupplier : consumerSuppliers) {
     consumerSupplier.close();
   }
   LOG.info("Flowlet suspended: " + flowletContext);
 }