code: public final void bindUntilJavaShutdown(Duration timeout, @Nullable Consumer<DisposableServer> onStart) {
  
  		Objects.requireNonNull(timeout, "timeout");
  		DisposableServer facade = bindNow();
  
  		Objects.requireNonNull(facade, "facade");
  
  		if (onStart != null) {
  			onStart.accept(facade);
  		}
  
  		Runtime.getRuntime()
  		       .addShutdownHook(new Thread(() -> facade.disposeNow(timeout)));
  
  		facade.onDispose()
  		      .block();
  	}
docs: Start the server in a fully blocking fashion, not only waiting for it to initialize
  but also blocking during the full lifecycle of the server. Since most
  servers will be long-lived, this is more adapted to running a server out of a main
  method, only allowing shutdown of the servers through {@code sigkill}.
  <p>
  Note: {@link Runtime#addShutdownHook(Thread) JVM shutdown hook} is added by
  this method in order to properly disconnect the server upon receiving a
  {@code sigkill} signal.</p>
  
  @param timeout a timeout for server shutdown
  @param onStart an optional callback on server start