Java 如何使用Quarkus进行长时间轮询

Java 如何使用Quarkus进行长时间轮询,java,asynchronous,jakarta-ee,quarkus,microprofile,Java,Asynchronous,Jakarta Ee,Quarkus,Microprofile,我想用长轮询模式实现一个API rest端点。while循环的问题是,它阻塞了线程,因此每个Http连接占用一个线程 例如,如果我有40个线程可用,我只能为长池创建40个并发Http连接,并且没有新请求的线程 我的长池请求对数据库进行调用,如果没有结果,它将再次循环 我不能使用Undertow,因为它不支持OIDC安全性,我将在将来开发一个好的模式,但我的时间有限 我看到了MySQLPool和Mutiny扩展,但它并不等待行数超过0的结果 有人能帮我吗?谢谢:) 有一些代码: 在我的用户资源

我想用长轮询模式实现一个API rest端点。while循环的问题是,它阻塞了线程,因此每个Http连接占用一个线程

例如,如果我有40个线程可用,我只能为长池创建40个并发Http连接,并且没有新请求的线程

我的长池请求对数据库进行调用,如果没有结果,它将再次循环

  • 我不能使用Undertow,因为它不支持OIDC安全性,我将在将来开发一个好的模式,但我的时间有限
  • 我看到了MySQLPool和Mutiny扩展,但它并不等待行数超过0的结果
有人能帮我吗?谢谢:)

有一些代码:

在我的用户资源中

    @GET
    @Path("/lp/by-group/{id}")
    @RolesAllowed({"ADMINISTRATOR"})
    public Multi findByGroupId(@PathParam Long id) {
        return userService.longPoolingByGroupId(id);
    }

在我的用户服务中:

    public Multi<UserDTO> longPoolingByGroupId(Long id) {
        return this.userDAO.findAsyncByGroupIdDTO(id);
    }

一般来说,这不是一个好的做法。客户端应该使用多个请求进行轮询,直到他收到预期的数据。我知道,但这是为了进行即时更新,延迟在我的应用程序中很重要。我想我会在connect上使用checkToken创建一个websocket
return pool.preparedQuery("SELECT * FROM user u LEFT JOIN hos_user_groups ug on u.id = ug.user_id where ug.group_id = " + id)
                .onItem()
                .produceMulti(rows -> Multi.createFrom().items(() -> StreamSupport.stream(rows.spliterator(), false))
                        .onItem().apply(UserDTO::new)

                );