public <O> PipelineBuilder<I, O> thenProcessAsync(
      final String stageName,
      final Function<T, CompletableFuture<O>> processor,
      final int maxConcurrency) {
    return addStage(new AsyncOperationProcessor<>(processor, maxConcurrency, false), stageName);
  }
Adds a 1-to-1, asynchronous processing stage to the pipeline. A single thread reads items from
the input and calls <i>processor</i> to begin processing. While a single thread is used to
begin processing, up to <i>maxConcurrency</i> items may be in progress concurrently. When the
returned {@link CompletableFuture} completes successfully the result is passed to the next
stage.

<p>If the returned {@link CompletableFuture} completes exceptionally the pipeline will abort.

<p>Note: The order of items is not preserved.

@param <O> the output type for this processing step.
@param stageName the name of this stage. Used as the label for the output count metric.
@param processor the processing to apply to each item.
@param maxConcurrency the maximum number of items being processed concurrently.
@return a {@link PipelineBuilder} ready to extend the pipeline with additional stages.
services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/PipelineBuilder.java