Thanks for the suggestions Carter this is what I came up with let me know if anything stands out as being incorrect. I was getting an error if I did not call unDispatch and this seems to work.

    public void handleRequest(HttpServerExchange exchange) throws Exception {

        Duration duration = durationFunc.apply(exchange);


        final HttpHandler delegate;

        if (exchange.isBlocking()) {

            // We want to undispatch here so that we are not blocking

            // a worker thread. We will spin on the IO thread using the

            // built in executeAfter.

            exchange.unDispatch();

            delegate = new BlockingHandler(next);

        } else {

            delegate = next;

        }


        exchange.dispatch(exchange.getIoThread(), () -> {

            exchange.getIoThread().executeAfter(() ->

                Connectors.executeRootHandler(delegate, exchange),

                duration.toMillis(),

                TimeUnit.MILLISECONDS);

        });

    }


https://www.stubbornjava.com/posts/creating-a-non-blocking-delay-in-the-undertow-web-server-for-artificial-latency#delay-handler-implementation

Thanks,
Bill

On Fri, Jan 4, 2019 at 9:33 AM Carter Kozak <c4kofony@gmail.com> wrote:
Perhaps some thing along these lines:

public void handleRequest(HttpServerExchange exchange) throws Exception {
    exchange.dispatch(SameThreadExecutor.INSTANCE, () -> {
        exchange.getIoThread().executeAfter(() ->
                Connectors.executeRootHandler(handler, exchange),
duration, unit);
    });
}



On Fri, Jan 4, 2019 at 12:53 AM Bill O'Neil <bill@dartalley.com> wrote:
>
> Hello,
>
> I'm looking for a way to add artificial latency to requests and I'm having trouble finding a way that wouldn't require a blocking pool with 1 thread per request.
>
> What I would like to happen if possible.
>
> handler marks exchange as not ready (yield / pause)
> async runnable from another thread marks it ready to resume after some time
> next iteration of IO loop catches that it is ready and actually executes it now.
>
>
> public void handle(HttpServerExchange exchange) {
>     if (firstExecution) {
>         scheduledExec.schedule(() -> exchange.resume(), duration, unit);
>         return;
>     }
>     next.handle(exchange);
> }
>
> Is something like this possible while staying on the IO threads the whole time other than the ScheduledExecutorService? I was thinking of using dispatch and dispatching back to the IO executor but I don't think that will do what I intend.
>
> The end goal would be a way to handle N requests with various delays built in to simulate latency without blocking connections. For instance if the worker pool has 30 threads and I submit 100 requests with a 1 minute delay followed by 1 request with a 10 second delay the final request should come back first.
>
> Thanks,
> Bill
> _______________________________________________
> undertow-dev mailing list
> undertow-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/undertow-dev