code: public static <T> VertxCompletableFuture<T> supplyBlockingAsync(Context context, Supplier<T> supplier) {
      Objects.requireNonNull(supplier);
      VertxCompletableFuture<T> future = new VertxCompletableFuture<>(context);
      context.<T>executeBlocking(
          fut -> {
            try {
              fut.complete(supplier.get());
            } catch (Throwable e) {
              fut.fail(e);
            }
          },
          false,
          ar -> {
            if (ar.failed()) {
              future.completeExceptionally(ar.cause());
            } else {
              future.complete(ar.result());
            }
          }
      );
      return future;
    }
docs: Returns a new CompletableFuture that is asynchronously completed by a task running in the worker thread pool of
  Vert.x
  <p>
  This method is different from {@link CompletableFuture#supplyAsync(Supplier)} as it does not use a fork join
  executor, but the worker thread pool.
  
  @param context  the context in which the supplier is executed.
  @param supplier a function returning the value to be used to complete the returned CompletableFuture
  @param <T>      the function's return type
  @return the new CompletableFuture