问题标签 [mutiny]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Quarkus:如何将方法从命令式更改为反应式
我构建了一个小的 Rest API 来了解更多关于 Quarkus 框架的信息。现在我想开始使用带有反应式 API 的框架,但我很难理解一些概念。目前,该项目正在使用 RESTEasy Reactive with Jackson,Hibernate Reactive with Panache 和 Postgresql Reactive Client。
这是我的课
现在,在我的服务中(势在必行),我执行以下操作:
角色类
角色服务类
这显然会在数据库中注册 UserRole 枚举中的所有角色,并且它工作正常。我想要实现的是复制这种方法,但使用反应形式。这些是我在代码中所做的更改
角色类
角色服务类
当我运行应用程序时,它没有给出任何错误,日志显示发生了一些事情,数据库创建了表,但是它没有插入任何东西。我以不同的方式尝试过它,但是,我没有成功地让它像我希望的那样工作。
transactions - 无法从 IO 线程启动 JTA 事务
我正在尝试在 quarkus 2.2 上测试一些用 mutiny 实现的反应性代码。这段代码做一些 sql 查询,我想要一个事务方法。
据我所知,为了测试响应式代码,我必须明确地等待结果。但是当有事务时,我得到一个 io.quarkus.runtime.BlockingOperationNotAllowedException: Cannot start a JTA transaction from the IO thread。
这里是测试:
使用此代码,异常将在最后一行抛出。
如果我用 listUniAssertSubscriber.assertCompleted(); 替换最后一行,测试将失败并显示“预期完成事件,但未收到它”。
有人知道是否有办法用事务测试反应性代码?
quarkus - 如何在另一个线程上运行阻塞代码并使http请求立即返回
Quarkus
我们用and开始了一个新项目,并Mutiny
用 Quarkus 创建了一堆端点,到目前为止@Funq
一切正常。现在我们想在其中一个端点处理一些非常耗时的事情,我们期望的是,一旦用户点击一个按钮从前端发送 http 请求并点击这个特定的端点,我们将202 Accepted
立即返回,留下从后端在另一个线程中进行耗时的操作处理,然后在完成后向用户发送相应的通知电子邮件。
我知道这可以用@Async
or来完成CompletableFuture
,但现在我们想用Mutiny
. 根据我Mutiny
在这里阅读文档的方式https://smallrye.io/smallrye-mutiny/guides/imperative-to-reactive,runSubscriptionOn
将通过在另一个线程上运行耗时的方法来避免阻塞调用者线程,并且我的测试显示了时间- 消耗代码确实在不同的线程上执行。但是,http 请求确实会not
立即返回,它仍然处于挂起状态,直到耗时的方法完成执行(正如我在浏览器的开发人员工具中观察到的那样)。我误解了它的runSubscriptionOn
工作原理吗?如何使用 实现此功能Mutiny
?
我的@Funq
端点看起来像这样
编辑:我Uni
根据@Ladicek 的回答找到了解决方案。在深入研究 Quarkus 和 Uni 之后,我有一个后续问题:
目前我们的大多数阻塞方法都是not
在级别上返回 Uni Service
,而不是我们从它们返回的内容(即对象或列表)中创建 Uni 对象,并Controller
在其端点中返回 Uni 级别,如下所示
return Uni.createFrom().item(() -> myService.myIOBlockingMethod(request))
.
正如@Ladicek 解释的那样,我不必.runSubscriptionOn
显式使用,因为 IO 阻塞方法将自动在工作线程上运行(因为我在服务级别的方法确实not
返回 Uni)。这有什么缺点吗?我的理解是,这将导致更长的响应时间,因为它必须在 I/O 线程和工作线程之间跳转,对吗?
对此的最佳做法是什么?我是否应该始终Uni
在级别返回这些阻塞方法,Service
以便它们也可以在 I/O 线程上运行?如果是这样,我想我总是需要调用.runSubscriptionOn
以在不同的工作线程上运行它,这样 I/O 线程就不会被阻塞,对吗?
quarkus - Mutiny Uni 转换为原始类型
到目前为止,我已经在 Quarkus 中使用 smallrye Mutiny 完成了非常基本的事情。基本上,我有一两个非常小的 Web 服务,它们只与 Web 应用程序交互。这些服务返回一个Uni<Response>
.
现在我正在编写一个日志服务,我希望我的其他人将信息传递给。在这个日志服务中,我需要向调用服务返回一个值。日志服务会将此值作为Uni<Integer>
. 我正在努力解决的是如何将调用服务中的返回值提取为int
.
这是日志服务中的功能
这是调用服务中的客户端代码
基本上我尝试过的所有东西都会创建另一个Uni
. 也许我只是在使用这个概念都错了。但是我怎样才能摆脱Integer
困境,Uni
这样我才能得到intValue
呢?
hibernate - quarkus 反应式命名数据源 em 为空
所以,
我的 Quarkus 项目 (v2.2.2) 具有以下核心功能:
- 带有兵变的反应式postgresql数据库
- 用于不模拟存储库的测试的 h2 数据库
在编写测试时,我在 quarkus 启动期间遇到了一个错误(忘记了那个错误是什么),但是一些页面建议切换到命名数据源以避免这个问题。这在当时似乎奏效了,我的模拟存储库测试通过了。
快进一点,我尝试做一个使用数据库的测试。我现在收到此错误:
我的 application.yml (customers
作为命名数据源):
我的测试:
我的控制器的第一步是使用这个存储库:
和我的实体:
根据我发现的@persistenceUnit
实体对象应该关联适当的数据源。但是, Mutiny$Session 似乎为空。我错过了什么吗?
更新 1
在 Quarkus v 2.3.0 CR1 上
完整的依赖树在这里:https ://www.codepile.net/pile/8jQeJ3j2
场景一:默认数据源(没有 PersistenceUnit 注解并且 application.yaml 没有数据源的名字)
在运行测试我得到这个错误:
场景 2:如果我将其设置为使用命名数据源,我会得到:
quarkus - Quarkus RESTEasy 反应式在 2.2 版之前如何工作?
我们目前使用的是旧版本的 Quarkus,所以我想了解影响并考虑是否应该升级到最新版本。
我了解到,自 2.2 版以来,Quarkus 将根据方法返回类型(https://quarkus.io/blog/resteasy-reactive-smart-dispatch/#new-world-new-rulesI/O thread
)运行方法,这意味着阻塞/ //同步方法不返回,会自动卸载到工作线程,不会阻塞I/O线程。Worker thread
Uni
Multi
CompletionStage
在我们当前使用旧版 Quarkus 和 RESTEasy Reactive(我认为是 1.12.2)的实现中,对于所有not
返回的方法Uni
//我相信它们将在 I/O 线程上被调用,因为我们没有在它们上使用Multi
它们。这些方法包括调用外部 API、访问数据库和访问文件等操作,所以我认为我们应该有责任通过使用响应式库以非阻塞/异步方式执行这些操作,否则它们会阻塞 I/ O 线程(鉴于并非我提到的所有这些方法当前都是使用响应式库实现的)。但是升级到最新版本将解决这个问题,因为这些方法将被卸载到工作线程,我正确吗?CompletionStage
@Blocking
PS:通过阅读 Quarkus 文档,我了解到最少的 I/O 线程可以处理许多并发请求。我很好奇默认情况下有多少个 I/O 线程,这是可配置的吗?谢谢!
apache-kafka - Mutiny - Kafka 写入顺序发生
我是 Quarkus 的新手。我正在尝试使用接收输入的 quarkus reactive 编写 REST 端点,进行一些验证,将输入转换为列表,然后将消息写入 kafka。我的理解是将所有内容都转换为 Uni/Multi,这将导致在 I/O 线程上以异步方式执行。在 intelliJ 日志中,我可以看到代码在执行程序线程中以顺序方式执行。kafka 写入顺序发生在其自己的网络线程中,这增加了延迟。
我已经做了几天了。不确定是否做错了什么。任何帮助,将不胜感激。谢谢
mutiny - Mutiny - 结合 Unis 列表
我有两个 Uni 列表如下 -
现在,我想将这些列表组合成一个 Unis 列表
我正在尝试使用Uni#combine
.
然后结合uniList1
anduniList2
但无法为 combineWith 提供正确的 lambda。
hibernate - 如何使惰性关系保持在休眠状态下反应
我正在使用带有休眠反应的 Quarkus,一旦我添加了 @OneToMany 注释,我就无法使我的实体持续存在。我向您展示我的所有代码:
实体一:树:
实体二:水果:
树库:
create 方法不会在数据库中保留任何树,因此所有对 session.find(...) 的调用都返回 null。在将 Tree 关系添加到水果之前,使用此方法在水果存储库中一切正常
任何建议表示赞赏。
apache-kafka - Quarkus 中的 Kafka 背压
我正在开发一个项目,该项目需要从 GCP Pub/Sub 接收事件、下载文件、解析和处理文件,最后将结果发布到 Kafka 代理,但我收到SRMSG00034: Insufficient downstream requests to emit item。
在我第一次尝试发布到 Kafka 时,我使用流迭代 msgList,但我读到 Mutiny(https://quarkus.io/blog/mutiny-back-pressure/)可以控制背压,但我得到了同样的错误.
在我的场景中,我必须发布两个不同的列表,其中一个有大约 10k 条消息。我读到我可以使用@OnOverflow控制溢出配置,但我更喜欢保持默认配置,除非有必要进行一些更改。
你能为我指出正确的方向来解决这个问题吗?
提前致谢