Reputation: 1645
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
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