ohad edelstain
ohad edelstain

Reputation: 1645

How to send response before actions in quarkus/Vert.X

Following similar question in spring. I want to be able to get in the router the response. and do a response flush, so I could continue work on the server without extending the RTT

meaning, do something like the answer in spring:

    public void doSomething(@RequestBody List<Message> messages, HttpServletResponse response) {
    int code = (messages!=null && !messages.isEmpty()) ? HttpServletResponse.SC_OK
            : HttpServletResponse.SC_NOT_FOUND;
    if (code != HttpServletResponse.SC_OK) {
        response.sendError(code, res);
        return;
    }
    java.io.PrintWriter wr = response.getWriter();
    response.setStatus(code);
    wr.print(res);
    wr.flush();
    wr.close();

    // Now it it time to do the long processing
    ...
}

This is my quarkus code today:

@Path("/events")
class EventsRouter {
    val logger: Logger = Logger.getLogger(EventsRouter::class.java)

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    fun handleEvent(
        @HeaderParam("User-Agent") userAgent: String?,
        eventPayload: EventPayload,
    ): Response {
        val time = LocalDateTime.now()
        ...
        return Response.ok().build()
    }
}

Upvotes: 3

Views: 755

Answers (1)

noamyg
noamyg

Reputation: 3104

You can use Vert.x executeBlocking to run a blocking code asynchronously.

Here's an example (not tested, so please regard this as Pseudo):

@Path("/events")
class EventsRouter {
    val logger: Logger = Logger.getLogger(EventsRouter::class.java);
    private final Vertx vertx;

    @Inject                             
    public EventsRouter(Vertx vertx) { 
        this.vertx = vertx;             
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    fun handleEvent(
        @HeaderParam("User-Agent") userAgent: String?,
        eventPayload: EventPayload,
    ): Response {
        val time = LocalDateTime.now()
        vertx.executeBlocking(promise -> {
            //Do something...
            promise.complete();
        }, res -> {
            System.out.println("Something was done");
        });
        return Response.ok().build();
    }
}

Upvotes: 1

Related Questions