es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo enviar una respuesta antes de las acciones en Quarkus/Vert.X.

Siguiendo una pregunta similar en spring (https://stackoverflow.com/q/32072255), quiero obtener en el enrutador la respuesta y realizar un vaciado de respuesta para poder continuar trabajando en el servidor sin extender el RTT.

Esto significa que quiero hacer algo similar en spring:

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

// Ahora es momento de realizar el procesamiento largo
...

Este es mi código actual en Quarkus:

@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()
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder y manipular el objeto de respuesta en Vert.x, puedes usar el objeto RoutingContext, que proporciona acceso a los objetos de solicitud y respuesta. Aquí hay un ejemplo de uso de RoutingContext para establecer el estado de la respuesta y enviar una respuesta JSON:

    class EventsRouter {
        val logger: Logger = Logger.getLogger(EventsRouter::class.java)
    
        @POST
        @Consumes(MediaType.APPLICATION_JSON)
        fun handleEvent(
            @HeaderParam("User-Agent") userAgent: String?,
            eventPayload: EventPayload,
            context: RoutingContext
        ) {
            val time = LocalDateTime.now()
            ...
    
            // Establecer el estado de la respuesta
            context.response().setStatusCode(200)
    
            // Enviar una respuesta JSON
            val responseJson = JsonObject()
                .put("message", "Éxito")
                .put("payload", eventPayload.toJson())
    
            context.response()
                .putHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                .end(responseJson.toString())
    
            // Ahora puedes continuar procesando sin extender el RTT
            ...
        }
    }
    

    Nota que en este ejemplo, estamos usando JsonObject de la biblioteca core de Vert.x para construir el JSON de respuesta. toJson() es una función de extensión personalizada para convertir nuestro objeto EventPayload en un objeto JsonObject. También establecemos algunas cabeceras de respuesta con putHeader() antes de terminar la respuesta con end().

Comments are closed.