Java 如何使用Quarkus进行长时间轮询
我想用长轮询模式实现一个API rest端点。while循环的问题是,它阻塞了线程,因此每个Http连接占用一个线程 例如,如果我有40个线程可用,我只能为长池创建40个并发Http连接,并且没有新请求的线程 我的长池请求对数据库进行调用,如果没有结果,它将再次循环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的结果 有人能帮我吗?谢谢:) 有一些代码: 在我的用户资源
- 我不能使用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)
);