【问题标题】:How to send response before actions in quarkus/Vert.X如何在 quarkus/Vert.X 中的操作之前发送响应
【发布时间】:2022-01-01 02:39:32
【问题描述】:

春季中关注similar question。我希望能够在路由器中获得响应。并进行响应刷新,这样我就可以在不扩展 RTT 的情况下继续在服务器上工作

意思是,在春天做类似答案的事情:

    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
    ...
}

这是我今天的 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()
    }
}

【问题讨论】:

    标签: vert.x quarkus quarkus-rest-client vertx-httpclient


    【解决方案1】:

    您可以使用 Vert.x executeBlocking 异步运行阻塞代码。

    这是一个例子(未测试,所以请认为这是伪):

    @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();
        }
    }
    

    【讨论】:

    • 谢谢诺姆,看起来很有希望。不幸的是,我需要一些时间才能对其进行测试。但我会给你赏金,希望它会起作用:)
    • 试过了,不幸的是它不起作用...超出范围会中断内部运行的代码。
    • 我将“Thread.sleep(5000)”放在块内,我得到了睡眠中断异常。但感谢您到目前为止的尝试。
    • @ohadedelstain 你能更新你的问题并添加堆栈跟踪吗?
    猜你喜欢
    • 2015-11-11
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2020-02-16
    • 2015-12-06
    相关资源
    最近更新 更多