[undertow-dev] Delay execution of a HttpHandler

Bill O'Neil bill at dartalley.com
Wed Mar 13 22:38:15 EDT 2019


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 at 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 at 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 at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20190313/39481631/attachment.html 


More information about the undertow-dev mailing list