code: public static void boot(Service service,
                            InstanceListener instanceListener,
                            Thread.UncaughtExceptionHandler uncaughtExceptionHandler,
                            String... args) throws LoadingException {
  
      Objects.requireNonNull(uncaughtExceptionHandler);
      Thread.currentThread().setUncaughtExceptionHandler(uncaughtExceptionHandler);
  
      LOG.debug("Trying to create instance of service {} with args {}",
                service.getServiceName(), args);
  
      try (Service.Instance instance = service.start(args)) {
        final RequestHandler requestHandler = HttpServiceModule.requestHandler(instance);
  
        HttpServerModule.server(instance).start(requestHandler);
  
        final String serviceName = service.getServiceName();
        final MetaDescriptor metaDescriptor = instance.resolve(MetaDescriptor.class);
        final ApolloConfig config = instance.resolve(ApolloConfig.class);
  
        LOG.info("Started {} {} (apollo {}) with backend domain '{}'",
                 serviceName,
                 metaDescriptor.descriptor().version(),
                 metaDescriptor.apolloVersion(),
                 config.backend());
  
        if (instanceListener != null) {
          instanceListener.instanceCreated(instance);
        }
  
        instance.waitForShutdown();
  
        LOG.info("Starting shutdown of {} ...", serviceName);
      } catch (IOException e) {
        throw failure(e, "Failed to start service");
      } catch (InterruptedException e) {
        throw failure(e, "Service interrupted");
      } catch (Exception e) {
        throw failure(e, "Something went wrong");
      }
  
      LOG.info("Shutdown of {} complete", service.getServiceName());
    }
docs: Boot up a service and wait for it to shut down.
  
  @param service the service to start
  @param instanceListener gets called when a service instance has been created
  @param uncaughtExceptionHandler an exception handler that gets invoked for the current thread
  if any uncaught exceptions are thrown during service startup
  or while waiting for it to shut down.
  @param args arguments to the service
  @throws LoadingException in case of an error starting up